我想在python中为line in file做一种方法,其中行尾被重新定义为我想要的任何字符串.另一种说法是我想从文件而不是行读取记录;我希望它与阅读线一样快捷方便.
这是python,相当于设置perl的$/输入记录分隔符,或者在java中使用Scanner.这不一定必须用于文件中的行(特别是,迭代器可能不是文件对象).只是等同于避免将太多数据读入内存的东西.
也可以看看:
Add support for reading records with arbitrary separators to the standard IO stack
解决方法:
Python 2.x文件对象或Python 3.3 io类中没有任何内容可以让您为readline指定自定义分隔符. (文件中的for line最终使用与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(或在Python 2.x中使用io对象),并且想要使用已在BufferedIOBase中维护的缓冲区而不是仅在缓冲区顶部放置缓冲区那太棘手了. io
文档确实解释了如何做所有事情……但我不知道任何简单的例子,所以你真的必须阅读该页面的至少一半并浏览其余部分. (当然,你可以直接使用原始文件……但如果你想找到unicode分隔符则不能……)