【问题标题】:file stream processing in pythonpython中的文件流处理
【发布时间】:2015-02-19 17:30:29
【问题描述】:

我有一个数据文件,其中每个“行”由\n\n\n 分隔。我的解决方案是通过首先 slurping 文件,然后拆分行来隔离这些行:

 for row in slurped_file.split('\n\n\n'):
    ...

是否有一种“awk-like”方法可以在 Python 2.7.9 中将文件解析为流,并根据给定的字符串值拆分行?谢谢。

【问题讨论】:

  • file.read(num_bytes) 方法对您不起作用是否有特定原因?只是试图更好地理解需求。似乎基于将字节读取到缓冲区并产生拆分字符串的惰性生成器将是理想的选择。
  • 有一个bug/feature request 用于将这样的东西添加到 Python 标准库中;另请参阅this question,但也有更简单的解决方法。
  • \n\n\n 分隔大块数据(可以放入内存,但我事先不知道这些块的大小)。
  • 我认为这真的意味着 2 个空行?
  • 是的,用od -c解析时连续三个换行符。

标签: python


【解决方案1】:

所以标准库中没有这样的东西。但是我们可以制作一个自定义生成器来迭代这些记录:

def chunk_iterator(iterable):
    chunk = []
    empty_lines = 0
    for line in iterable:
        chunk.append(line)
        if line == '\n':
            empty_lines += 1
            if empty_lines == 2:
                yield ''.join(chunk[:-2])
                empty_lines, chunk = 0, []
        else:
            empty_lines = 0

    yield ''.join(chunk)

用作:

with open('filename') as f:
    for chunk in chunk_iterator(f):
        ...

这将使用 CPython 中用 C 编写的文件的每行迭代,因此比一般的记录分隔符解决方案更快。

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2013-04-22
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多