簡體   English   中英

Python編寫二進制文件,字節

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM