如何在python中从文件中读取自定义分隔符终止的记录?

我想在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分隔符则不能……)

上一篇:RF-日期时间拼接(20191024_195355)


下一篇:c – “除了最后一个之外的每个”(或“每个连续元素对之间”)的成语