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?
如果你的意图是简单地使文件的副本,你可以使用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:
...
这真的没有意义写在另一个文件中的文件。 你想要的是写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())
从了解到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 ''
。