当前位置: 首页 > 面试题库 >

使用更新的惯用法在二进制文件上进行Python文件迭代

姬弘文
2023-03-14
问题内容

在Python中,对于二进制文件,我可以这样编写:

buf_size=1024*64           # this is an important size...
with open(file, "rb") as f:
   while True:
      data=f.read(buf_size)
      if not data: break
      # deal with the data....

对于要逐行读取的文本文件,我可以编写以下代码:

with open(file, "r") as file:
   for line in file:
       # deal with each line....

简写为:

with open(file, "r") as file:
   for line in iter(file.readline, ""):
       # deal with each line....

PEP
234中
记录了该惯用语,但我无法为二进制文件找到类似的惯用语。

我已经试过了:

>>> with open('dups.txt','rb') as f:
...    for chunk in iter(f.read,''):
...       i+=1

>>> i
1                # 30 MB file, i==1 means read in one go...

我尝试放置,iter(f.read(buf_size),'')但这是语法错误,因为在iter()中的callable之后有括号。

我知道我可以编写一个函数,但是默认习惯用法有没有办法在for chunk in file:哪里使用缓冲区大小而不是面向行?

感谢您忍受Python新手尝试编写他的第一个平凡而又惯用的Python脚本。


问题答案:

我不知道有任何内置方法可以执行此操作,但是包装函数很容易编写:

def read_in_chunks(infile, chunk_size=1024*64):
    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

然后在交互式提示下:

>>> from chunks import read_in_chunks
>>> infile = open('quicklisp.lisp')
>>> for chunk in read_in_chunks(infile):
...     print chunk
... 
<contents of quicklisp.lisp in chunks>

当然,您可以轻松地对此进行修改以使用with块:

with open('quicklisp.lisp') as infile:
    for chunk in read_in_chunks(infile):
        print chunk

您可以消除这样的if语句。

def read_in_chunks(infile, chunk_size=1024*64):
    chunk = infile.read(chunk_size)
    while chunk:
        yield chunk
        chunk = infile.read(chunk_size)


 类似资料:
  • 问题内容: 我发现用Python读取二进制文件特别困难。你能帮我个忙吗?我需要读取此文件,在Fortran 90中,该文件很容易被读取 详细而言,文件格式为: 如何使用Python阅读?我尝试了一切,但没有成功。我是否有可能在python中使用f90程序,读取此二进制文件,然后保存需要使用的数据? 问题答案: 读取二进制文件内容,如下所示: 然后使用struct.unpack “解压缩”二进制数据

  • 本文向大家介绍使用Python进行二进制文件读写的简单方法(推荐),包括了使用Python进行二进制文件读写的简单方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。 python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是

  • 下面是一个上传二进制文件的例子,WebService类的代码如下: package service; import java.io.InputStream; import java.io.OutputStream; import java.io.FileOutputStream; import javax.activation.DataHandler; public class 

  • 根据https://docs.python.org/3.4/library/venv.html#module-venv所说的“每个虚拟环境都有自己的Python二进制文件(允许创建具有各种Python版本的环境)”,那么我如何使用具有Python 2.7二进制文件的venv模块来创建虚拟环境呢?

  • 问题内容: 我正在使用Flash录制音频并将其上传到节点服务器。Flash客户端是jrecorder的变体。当用户完成录制后,将使用POST请求(而不是表单,因为Flash无法创建文件)来上传音频,并将音频ByteArray作为POST请求的数据(请参见此处的更多信息)。 我可以使用下面的代码在Node- land上正确接收文件,但是发出的音频被破坏了,您听不到任何声音。话虽如此,该文件的内容可以

  • 问题内容: 为了将二进制文件上传到URL,建议使用本指南。但是,该文件不在目录中,而是存储在MySql db的BLOB字段中。BLOB字段在JPA中映射为属性: 我以这种方式稍微修改了指南中的代码: 我没有使用分块流。使用的标头是: 主机正确接收了所有标头。它还接收上载的文件,但不幸的是,它抱怨该文件不可读,并且断言所接收文件的大小比我的代码输出的大小大37个字节。 我对流,连接和byte []的