Python编写二进制文件,字节

Python编写二进制文件,字节,python,python-3.x,io,buffer,bufferedreader,Python,Python 3.x,Io,Buffer,Bufferedreader,Python 3。我正在使用QT的文件对话框小部件保存从internet下载的PDF。我一直在使用“打开”读取文件,并尝试使用“文件对话框”小部件编写它。但是,我遇到了一个“TypeError:”\u io.BufferedReader“不支持缓冲区接口”错误 示例代码: with open('file_to_read.pdf', 'rb') as f1: with open('file_to_save.pdf', 'wb') as f2: f2.write(f1)

Python 3。我正在使用QT的文件对话框小部件保存从internet下载的PDF。我一直在使用“打开”读取文件,并尝试使用“文件对话框”小部件编写它。但是,我遇到了一个“TypeError:”\u io.BufferedReader“不支持缓冲区接口”错误

示例代码:

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

当不使用“b”指示符时,或者当从web读取文件(如urllib或请求)时,此逻辑可以正确处理文本文件。这些是“bytes”类型的,我想我需要像打开文件一样打开它。相反,它是作为缓冲读取器打开的。我尝试了bytes(f1),但得到的“TypeError:“bytes”对象不能解释为整数。“任何ideaas?

如果您只是想复制文件,您可以使用

或者,如果您需要逐字节访问,类似于您的结构,这可以工作:

>>> 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
但是一个字节接一个字节的速度可能非常慢

或者,如果您想要一个缓冲区来加快速度(而不冒将未知文件大小完全读入内存的风险):

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


在另一个文件中写入一个文件是没有意义的。您想要的是在f2中写入f1的内容。您可以使用f1.read()获取内容。所以你必须这样做:

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

python食谱中学习

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
将在遇到
空白字符串“

时结束,只需尝试-
data=list(f1.read())
f2.write(data)
'list'显然也不支持缓冲区接口。谢谢您-您的第二个和第三个解决方案都有效。(由于QT的“保存”对话框的工作方式,无法使用copyfile)简单地在bufferedReader上使用.read()将其转换为字节似乎也可以——我想我已经尝试过了。从您的示例中学习了一些新内容。请注意,变量名
bytes
可能与Python内置类型
bytes
冲突,后者在Python 3.x中表示二进制数据!(在Python2.7中,它只是
str
的别名)@minmaxavg:你说得对,我会在有机会时改变的。谢谢看看它是如何在中使用的。要复制文件元数据,也可以使用
shutil.copy2()
。如果你想要@minmaxavg:1-甚至我的手机也是64位的。2-是的,Windows上有
mmap
。阅读
mmap
模块的官方Python文档。这就是当前解决方案的样子。虽然这样做有效,但整个文件在写入之前都会被读入内存——内存不是很友好。正如Python
中所述,如果文件的大小是机器内存的两倍,那就是您的问题了
我用这段代码得到了一个无限循环,可能无法正确识别EOF。来自@dawg的回答与预期一样好。刚学了进一步的阅读,用“b”作为EOF。。。
with open('/tmp/fin.pdf','rb') as f1,open('/tmp/test.pdf','wb') as f2:
    ...
with open('file_to_read.pdf', 'rb') as f1: 
    with open('file_to_save.pdf', 'wb') as f2:
        f2.write(f1.read())
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)