Python 2.xfile
对象或Python 3.3io
类中没有任何内容可让您为指定自定义分隔符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
文档的确说明了如何做所有事情……但是我不知道任何简单的示例,因此您实际上必须至少阅读该页面的一半,然后略过其余部分。(当然,您可以直接使用原始文件…,但是如果您要查找unicode分隔符,则不能使用…)