【问题标题】:Does "for line in file" work with binary files in Python?“for line in file”是否适用于 Python 中的二进制文件?
【发布时间】:2015-10-16 09:41:05
【问题描述】:

this question 的答案之一说,以下是读取大型二进制文件而不先将整个文件读入内存的好方法:

 with open(image_filename, 'rb') as content:
     for line in content:
         #do anything you want

我认为指定'rb' 的全部意义在于忽略行尾,因此for line in content 如何工作?

这是读取大型二进制文件的最“Pythonic”方式还是有更好的方式?

【问题讨论】:

  • 我刚刚将您的问题作为评论发布在该问题的答案下方。这似乎比提出一个新问题要好。
  • @Ah 谢谢,这个问题我该怎么办?
  • 好吧,已经来不及删除了,因为有人回答了。
  • 可能是duplicate
  • 所有的答案都很有帮助,不过我不能再接受 4 分钟的答案,如果应该是评论,我很抱歉。

标签: python


【解决方案1】:

我会写一个简单的辅助函数来读取你想要的块:

def read_in_chunks(infile, chunk_size=1024):
    while True:
        chunk = infile.read(chunk_size)
        if chunk:
            yield chunk
        else:
            # The chunk was empty, which means we're at the end
            # of the file
            return

像这样使用for line in file

with open(fn. 'rb') as f:
    for chunk in read_in_chunks(f):
        # do you stuff on that chunk...

顺便说一句:我在 5 年前问过 THIS 问题,这是当时答案的变体......


你也可以这样做:

from collections import partial
with open(fn,'rb') as f:
    for chunk in iter(functools.partial(f.read, numBytes),''):

【讨论】:

  • 我现在正在阅读这个问题。我想这是一种重复(对不起,我没有看到)。作为后续,你如何确定正确的chunk_size
  • 每个chunk的特点是什么?你将如何处理它?文件是否太大而无法一口气读取?当您拥有for record in file: 时,通常每个record 与整个file 之间都有一些类似记录的关系。你需要多说。
  • 5 年前你还是个“Python 新手”?
  • 确实是。在此之前 Perl 是我的武器,在此之前是 C。
【解决方案2】:

二进制模式意味着不转换行尾并且读取bytes对象(在Python 3中);使用for line in f 时,文件仍将被“行”读取。不过,我会使用read 来读取一致的块。

with open(image_filename, 'rb') as f:
    # iter(callable, sentinel) – yield f.read(4096) until b'' appears
    for chunk in iter(lambda: f.read(4096), b''):
        …

【讨论】:

  • 为什么是4096的大小?
  • 因为你必须选择一个尺寸......这并不重要(很好的答案 minitech)
  • 嗯,这很重要。只是不多。您必须有足够多的可用内存一次全部使用。否则为什么要分块?啜饮整个文件。 minitech 或 Joran 试图告诉你它应该有多大的问题是他们不知道你的系统要求、环境或用例。如有疑问,请尝试一下。 2 的倍数很受欢迎,因为它们易于系统管理。
【解决方案3】:

for line in fh 将在新行处拆分,无论您如何打开文件

通常对于二进制文件,您会以块的形式使用它们

CHUNK_SIZE=1024
for chunk in iter(lambda:fh.read(CHUNK_SIZE),""):
    do_something(chunk)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多