2016-04-11 9 views
3

私はいくつかのバイナリファイルを解析しようとしており、Pythonのread()関数がこのarticleとチュートリアルポイントarticleからの文字列を返すと仮定しました。なぜread()は文字列ではなくバイトを出力しますか?

しかし、自分がread()をめちゃくちゃうったとき、私は読んだもの以外の何かを得ました。

>>> with gzip.open('RTLog_20150424T194428.gz') as f: 
     a = f.read(3) 
     print(a) 
     type(a) 


b'use' 
<class 'bytes'> 
>>> a 
b'use' 
>>> str(a) 
"b'use'" 
>>> b = 'asdfasdfasdf' 
>>> type(b) 
<class 'str'> 
>>> 

自分で試験した場合、read()コールの出力は<class 'bytes'>オブジェクトではなく、<class 'str'>オブジェクトを返しました。

私は何を得ていないのですか?

+2

おそらく 'gzip.open'がファイルをバイナリモードで開くためです。 – vaultah

+0

私が読んできたチュートリアルでは、バイナリファイルではなくテキストファイルを開いていると仮定しています。 – Dzhao

+1

リンクしたページの例は、 'gzip.open'ではなく' open'を使っていることを示しています。これらの関数は 'mode'引数のデフォルト値が異なります。 – vaultah

答えて

4

:概要で述べたように

、PythonはバイナリとテキストI/Oを区別します。バイナリモードでオープンされたファイル(mode引数に 'b'を含む)は、内容をデコードせずにバイトオブジェクトとして返します。テキストモード(デフォルト、または 't'がmode引数に含まれる場合)では、ファイルの内容がstrとして返されます。バイトは、プラットフォーム依存のエンコーディングを使用して最初にデコードされています。

Python 3は文字(文字列)に対して非常に慎重です。 Python 2はそれにつきものであり、多くの問題を引き起こす可能性があります。

+0

私はこれも私の質問に答えるので受け入れられることを選んだ。古いバージョンのPythonでドキュメントを読むときには、本当に注意する必要があると思います。 – Dzhao

4

rbまたはrtモードで開くことができます(デフォルトではバイナリが読み込まれ、バイト数が与えられます)。これはgzip.openドキュメント文字列に記載されている:

モード引数は、 "R"、 "RB"、 "W"、 "WB"、 "X"、 "XB"、 "a" 又は "AB" であることができます バイナリモードの場合、またはテキストモードの場合は "rt"、 "wt"、 "xt"または "at"です。デフォルトモードは 「RB」であり、あなたがreadを呼び出すときに開く(とあなたが正しいエンコーディングを知っている)とき、あなたは文字列を取得する必要がありますキーワード引数mode="rt"が返さ合格した場合、デフォルトのCOMPRESSLEVELは9

です方法。あなたはPythonの2の情報

documentation状態にリンクされているのPython 3を使用している

+0

バイナリファイルを読んでいるのですがこれは私の出力がタイプバイトであることを意味しますか? – Dzhao

+4

@Dzhao:そうだね。 Python 2を想定しているリソースで混乱しているかもしれません。 'str'はバイトテスト型です。 – user2357112

+0

任意のファイルをバイトまたはテキストとして読み取ることができます。ガベージを取得するかどうかは、ファイル内の内容によって異なります。 – wim

関連する問題