[英]Python writing binary files, bytes
Python 3.我正在使用QT的文件對話框小部件來保存從互聯網下載的PDF。 我一直在使用'open'讀取文件,並嘗試使用文件對話框小部件來編寫它。 但是,我一直遇到“TypeError:'_ 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或者請求,此邏輯適用於文本文件。 這些是“字節”類型,我認為我需要打開文件。 相反,它作為緩沖讀者開放。 我嘗試了字節(f1),但得到“TypeError:'bytes'對象不能被解釋為整數。” 有什么想法嗎?
如果您的目的是簡單地制作文件的副本,則可以使用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:
...
在另一個文件中寫入文件真的沒有意義。 你想要的是在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 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 ''
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.