配列 - python3 バイナリ 書き込み




バイナリファイル、バイトを書き込むPython (2)

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'指定子を使用していない場合、またはurllibや要求のようにWebからファイルを読み込んでいるときに、テキストファイルで正しく動作します。 これらは 'bytes'型のもので、ファイルを開くときに必要と思うものです。 代わりに、Buffered Readerとして開かれています。 私はバイト(f1)を試しましたが、 "TypeError: 'バイト'オブジェクトは整数として解釈できません。 どんなアイデアですか?


ファイルを別のファイルに書き込むことは本当に意味がありません。 あなたが望むのは、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())

あなたの意図が単純にファイルのコピーを作ることであるなら、あなたは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ブロックを2つ使用するのではなく、このショートカットを使用することもできます。

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






bufferedreader