2013-05-14 5 views
7

私は、Pythonのチュートリアルでこれを読んで:Windows上のPythonは、テキストとバイナリファイルを区別します(http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-filesPythonはバイナリファイルを扱うのに危険ですか?

。 テキストファイルの行末文字は、データの読み取りまたは書き込み時に自動的にわずかに変更されます( )。ファイル へのこの舞台裏での変更はASCIIテキストファイルでは問題ありませんが、JPEGやEXEファイルでは のようなバイナリデータが破損します。読み込み時にはバイナリモードを使用し、そのようなファイルを書き込む場合は、 を使用するように十分注意してください。

「テキストファイルの行末の文字がどのように変更されているか」は分かりませんが、「バイナリデータが壊れます。 バイナリデータには行末のようなものはありません。

誰かが私のためにこの段落の詳細を説明できますか?私はPythonがバイナリファイルを歓迎しないように感じています。

+4

「バイナリモードを使用する場合は非常に注意してください」ではなく、「バイナリモードを使用するには非常に注意してください」と書かれています。バイナリモードは安全です。 – Matthias

答えて

14

テキストファイルではなく、バイナリ(open(filename, "rb"))としてファイルを開く必要があります。その後、データの使用に問題はありません。

特に、Windowsの行末は'\r\n'です。また、バイナリファイルをテキストファイルとして読み込んで書き出すと、'\n'という文字列が'\r\n'のシーケンスに変換されます。ファイルをバイナリとして(読み書き用に)開くと、にはというような問題があります。

Pythonはバイナリデータを扱うことができるため、Pythonだけでなく、Windowsシステムのどの言語でもこの種の注意を払わなければなりません(しかし、Pythonの開発者は、問題)。行末が単一文字であるLinuxのようなシステムでは、この区別も存在しますが、バイナリデータをテキストとして読み書きするときに問題が発生する可能性は低くなります(つまり、ファイルを開くためのbオプションなし)。

+0

入手しました。 Python(およびその他の言語)では、 'r'を使用すると、シーンの後ろに特殊文字(行末)が表示されます。ですから、テキストモードを使ってバイナリファイルを扱うのは間違いです。 –

2

バイナリデータには行末のようなものはないと感じます。

バイナリファイルには、文字\ nを含むANY POSSIBLE文字を使用できます。 Pythonがバイナリファイル内の文字を暗黙的に別のものに変換することは望ましくありません。 Pythonは、あなたがそれを教えない限り、バイナリファイルを読み込んでいることを知らない。そして、Pythonがテキストファイルを読み込むと、自動的に\ n文字がOSの改行文字に変換されます。これはWindows上では\ r \ nです。

これはすべてのコンピュータプログラミング言語で動作する方法です。

ファイルについて考えるもう1つの方法は、ファイルは単なる長い一連のバイト(8ビット)です。 1バイトは単なる整数です。バイトは任意の整数にすることができます。バイトが整数10の場合、文字\ nのASCIIコードになります。ファイル内のバイトがバイナリデータを表している場合、Pythonは10で読み込み、2と13と10の2バイトに変換したくありません。通常、バイナリデータを読み込むと、最初の2バイト明らかに、Pythonが突然バイトの1つを2バイトに変換すると、2つの問題が発生します:1)データを変更する、2)すべてのデータ境界を変更する台無しになるでしょう。

例:ファイルの最初のバイトが犬の体重を表すと仮定し、バイトの値が10であるとします。次のバイトは犬の年齢を表し、その値は1です。 2バイトに\ n個のASCIIコード、である10:

そして、あなたがのために第二のバイトを抽出:10と13は、その後、データのpythonの手は、あなたは次のようになります犬の年齢では、あなたは13歳ではなく1歳になります。

ファイルには「文字」が含まれていると言われていますが、それは間違いです。コンピュータは文字を格納できません。彼らは番号を格納することしかできません。したがって、ファイルは長い一連の数字に過ぎません。これらの数字をASCIIコード(文字を表すコード)として扱うようにPythonに指示すると、Pythonはテキストを返します。

1

Pythonのマニュアルで「やや変更する」とは、Unixの行末文字をWindowsの行末文字に変換することを意味します。これはWindowsでのみ行われるため、UnixやLinuxにはこの問題はありません。

関連する問題