В объекте file
Python 2.x или в классах io
Python 3.3 нет ничего, что позволяло бы указать пользовательский разделитель для readline
. (В конечном итоге for line in file
использует тот же код, что и readline
.)
Но его довольно легко построить самостоятельно. Например:
def delimited(file, delimiter='\n', bufsize=4096):
buf = ''
while True:
newbuf = file.read(bufsize)
if not newbuf:
yield buf
return
buf += newbuf
lines = buf.split(delimiter)
for line in lines[:-1]:
yield line
buf = lines[-1]
Вот глупый пример этого в действии:
>>> s = io.StringIO('abcZZZdefZZZghiZZZjklZZZmnoZZZpqr')
>>> d = delimited(s, 'ZZZ', bufsize=2)
>>> list(d)
['abc', 'def', 'ghi', 'jkl', 'mno', 'pqr']
Если вы хотите сделать это правильно как для двоичных, так и для текстовых файлов, особенно в 3.x, это немного сложнее. Но если это должно работать только для одного или другого (и одного языка или другого), вы можете игнорировать это.
Аналогично, если вы используете Python 3.x (или используете объекты io
в Python 2.x) и хотите использовать буферы, которые уже поддерживаются в BufferedIOBase
, вместо того, чтобы просто поместить буфер поверх буфера , это сложнее. Документы io
объясняют, как делать все… но я не знаю простых примеров, поэтому вам действительно придется прочитать хотя бы половину этой страницы и просмотреть остальную часть. (Конечно, вы можете просто использовать необработанные файлы напрямую... но не в том случае, если вы хотите найти разделители Юникода...)
person
abarnert
schedule
25.10.2013