Python中写二进制文件,字节(Python writing binary files, byte

2019-09-16 07:41发布

Python 3下我使用Qt的文件对话框控件来保存从互联网上下载的PDF文件。 我一直在使用“开放式”读取文件,并尝试使用该文件对话框控件写。 不过,我一直在运行到一个“类型错误:‘_io.BufferedReader’不支持缓冲区接口”的错误。

示例代码:

with open('file_to_read.pdf', 'rb') as f1: 
    with open('file_to_save.pdf', 'wb') as f2:
        f2.write(f1)

这个逻辑不使用“B”标志时,或阅读网页文件时,喜欢用的urllib或要求与文本文件正常工作。 这些都是“字节”型,我认为我需要被打开文件的。 相反,它的开放作为缓冲阅读器。 我试图字节(F1),但得到“类型错误:‘字节’对象不能被解释为一个整数。” 任何ideaas?

Answer 1:

如果你的意图是简单地使文件的副本,你可以使用shutil

>>> import shutil
>>> shutil.copyfile('file_to_read.pdf','file_to_save.pdf')

或者,如果您需要访问逐字节,类似于你的结构,工作原理:

>>> with open('/tmp/fin.pdf','rb') as f1:
...    with open('/tmp/test.pdf','wb') as f2:
...       while True:
...          b=f1.read(1)
...          if b: 
...             # process b if this is your intent   
...             n=f2.write(b)
...          else: break

但逐字节是潜在的很慢

或者,如果你想有一个缓冲区,将加快这(不考虑读一个未知的文件大小完全进入内存中的风险):

>>> with open('/tmp/fin.pdf','rb') as f1:
...    with open('/tmp/test.pdf','wb') as f2:
...       while True:
...          buf=f1.read(1024)
...          if buf: 
...              for byte in buf:
...                 pass    # process the bytes if this is what you want
...                         # make sure your changes are in buf
...              n=f2.write(buf)
...          else:
...              break

与Python 2.7+ 3.1+或者您也可以使用此快捷方式(而不是使用两个with块):

with open('/tmp/fin.pdf','rb') as f1,open('/tmp/test.pdf','wb') as f2:
    ...


Answer 2:

这真的没有意义写在另一个文件中的文件。 你想要的是写F1的内容F2。 你得到f1.read()的内容。 所以,你必须这样做:

with open('file_to_read.pdf', 'rb') as f1: 
    with open('file_to_save.pdf', 'wb') as f2:
        f2.write(f1.read())


Answer 3:

从了解到python cookbook

from functools import partial

with open(fpath, 'rb') as f, open(target_fpath, 'wb') as target_f: 
    for _bytes in iter(partial(f.read, 1024), ''):
        target_f.write(_bytes)

partial(f.read, 1024)返回一个函数,读取二进制文件1024个字节动不动。 iter将结束时,遇到一个blank string ''



文章来源: Python writing binary files, bytes