2016-12-02 9 views
5

ファイルを書きたいと思います。ファイルの名前に基づいて、gzipモジュールで圧縮されている場合とされていない場合があります。私のコードは次のとおりです。Python3書き込みgzipファイル - memoryview: 'str'ではなくバイト様オブジェクトが必要です

import gzip 
filename = 'output.gz' 
opener = gzip.open if filename.endswith('.gz') else open 
with opener(filename, 'wb') as fd: 
    print('blah blah blah'.encode(), file=fd) 

書き込み可能なファイルをバイナリモードで開き、書き込み対象の文字列をエンコードしています。しかし、次のエラーが表示されます。

File "/usr/lib/python3.5/gzip.py", line 258, in write 
    data = memoryview(data) 
TypeError: memoryview: a bytes-like object is required, not 'str' 

なぜ私のオブジェクトはバイトではありませんか? 'w'でファイルを開き、エンコードのステップをスキップすると同じエラーが発生します。ファイル名から'.gz'を削除すると、同じエラーが表示されます。私はUbuntuの16.04

+1

これは 'print(str( 'blah blah blah'.encode())、file = fd)'と同じです。 Pythonはbytesオブジェクトの文字列表現を書き込もうとしています。 – tdelaney

答えて

4

printにPython3.5を使用してい

は比較的複雑な関数です。ファイルにstrを書きますが、渡したstrは書き込まないので、パラメータをレンダリングした結果のstrが書き込まれます。

すでにバイトがある場合は、fd.write(bytes)を直接使用して、必要に応じて改行を追加することができます。

バイトがない場合は、fdが開いてテキストを受け取るようにしてください。

+0

'fd.write(b "blah blah blah")' –

+0

@citizenSNIPSを使用してください、私はあなたのコメントを理解していません。 – Javier

+0

strの前に 'b'を追加して、それがバイトであることを示します。私はあなたがバイトリテラルを渡したいと思う。 [](https://www.python.org/dev/peps/pep-3112/) –

2

このようにバイトに変換できます。

import gzip 
with gzip.open(filename, 'wb') as fd: 
    fd.write('blah blah blah'.encode('utf-8')) 
関連する問題