'r'モードでテキストファイルを解析すると、 'rb'モードで解析するよりも便利になるのはなぜですか? 特に、問題のテキストファイルにASCII以外の文字が含まれている可能性があります。 documentationからrとrbモードのテキストファイルの解析の違い
答えて
これは、使用しているPythonのバージョンによって少し異なります。 Python 2では、Chris Drappier's answerが適用されます。
Python 3では、テキストモード('r'
)とは異なる(より一貫性のある)ストーリーです。与えられたテキストエンコーディングに従ってファイルを解析します。プラットフォームに依存するデフォルト)、read()
はstr
を提供します。バイナリ('rb'
)モードでは、Pythonはそのファイルに文字として合理的に解析できるものが含まれていると仮定せず、read()
はbytes
オブジェクトを返します。 Pythonの3でまた
、ユニバーサル改行('\n'
とプラットフォーム固有の改行規則間の翻訳あなたがそれらを気にする必要はありませんので)上の任意のプラットフォームテキストモードのファイルのために利用可能であるだけでなく、 Windows。
py3の場合、テキストモードで読み込みが自動的にエンコードの種類を検出しようとしますか?エンコードを検出しなければならないのは、バイトオブジェクトでは非常に難しいことです。 – MxyL
@Keikokuメタデータなしでストリームだけに基づくエンコーディングを検出することは不可能です - アスキー+パリティではなく情報のための第8ビットを使用するさまざまなエンコーディングについて考えると、それらはすべて255の有効な1バイトシーケンスを共有しますが、それらの半分(ASCII半分)だけがそれぞれ同じ文字を表します。 Pythonのデフォルトは、セッション全体のデフォルトのエンコーディングである 'sys.getdefaultencoding()'と綴られています。私のPy3のインストールでは、そのUTF - 8が、あなたはそれが常に当てに依存することはできません。 – lvc
:
Windowsでは、 'B' モードに追加バイナリモードでファイルを開きますので、 'RB'、 'WB'、および「R + Bのようなモードもあります' Windows上のPythonでは、テキストファイルとバイナリファイルが区別されます。テキストファイルの行末の文字は、データの読み書き時に自動的に少し変更されます。ファイルデータのこのような舞台裏の変更は、ASCIIテキストファイルでは問題ありませんが、JPEGやEXEファイルのようなバイナリデータが破損します。このようなファイルを読み書きするときは、バイナリモードを使用するように十分注意してください。 Unixでは、モードに 'b'を付けることを害しません。したがって、それをすべてのバイナリファイルに対して独立して使用することができます。
基本的にバイナリモードで行を読み込もうとするのは、EOL文字が\ nか\ r \ nか何か他のものであることが保証されていないので、はるかに難しいですか? – MxyL
違いは、行末(EOL)の処理方法にあります。異なるオペレーティングシステムでは、UNIXではEOL-\n
、OS Xより前のMacバージョンでは\r
、Windowsでは\r\n
とマークするために、異なる文字を使用しています。ファイルがテキストモードで開かれると、ファイルが読み込まれると、ファイルから読み取られたOS固有の行末文字が、\n
に置き換えられます。逆に、テキストモードで開いたファイルに\n
を書き込もうとすると、OS固有のEOL文字が書き込まれます。 os.linesep
をチェックすることで、OSのデフォルトのEOLを見つけることができます。
バイナリモードでファイルを開くと、マッピングは行われません。あなたが読んだのはあなたが得るものです。テキストモードがデフォルトモードであることを覚えておいてください。あなたは非テキストファイル(画像、動画など)を処理しているのであれば、あなたはバイナリモードでファイルを開くことを確認してくださいそうしないと、いくつかのバイトを導入(または削除)して、ファイルをめちゃくちゃになってしまいます。
また、Pythonにはユニバーサル改行モードがあります。このモードでファイルを開くと、Pythonは文字\r
,\n
、\r\n
をすべて\n
にマッピングします。
これはPython 2とPython 3の両方で当てはまりますか? – Agostino
明確にするためとAgostino's comment/questionに答えるために(私は私の答えとしてこれを旨とそのコメントを負担するのに十分な評判を持っていない...):
なし行末変更は、どちらもテキストで起こらないのPython 2ではPython 2でこれまで説明したようにバイナリモードではありません。Chris Drappier's answerが適用されます(現在のリンクは3を指しています。引用されたテキストがPython 2 input and output tutorialから当然であるX Pythonのドキュメントが、クリス・)
はありませんので、非Windows上のPython 2 とテキストモードでファイルを開くと任意の行の末尾を行うこと真ではありません修正:
0 $ python2.7 -c 'f = open("data.txt", "rU"); print f.readlines()'
['line1\n', 'line2\n', 'line3\n']
: 0 $ cat data.txt
line1
line2
line3
0 $ file data.txt
data.txt: ASCII text, with CRLF line terminators
0 $ python2.7 -c 'f = open("data.txt"); print f.readlines()'
['line1\r\n', 'line2\r\n', 'line3\r\n']
0 $ python2.7 -c 'f = open("data.txt", "r"); print f.readlines()'
['line1\r\n', 'line2\r\n', 'line3\r\n']
0 $ python2.7 -c 'f = open("data.txt", "rb"); print f.readlines()'
まさに行末のmodを言っ行うんPythonの2、ユニバーサル改行モードでファイルを開くことが可能です
(ユニバーサル改行モード指定子はPython 3.xののとして推奨されていません)
のPython 3には、一方で、プラットフォーム固有の行がに正規化されたのですか終了「\ n」をテキストでファイルを読み込むときテキストモード(バイト< - >ユニコード< - >バイトのデコード/テキストモードでのエンコーディング)に加えて、 '\ n'は現在のプラットフォームのデフォルトの行末に変換されます。例えば。 LinuxでDos/WinのCRLF行で終わるファイルを読むと、行末は '\ n'に正規化されます。
のpython3のopen関数はモードがどのように機能するかユニバーサル改行 https://docs.python.org/3/library/functions.html#open 「改行のコントロールを(必要であれば、それはテキストのみに適用されることを制御するための改行のパラメータを持っています\ n '、' \ r '、' \ r \ n 'のいずれかを指定することができます。有効 " – Davos
- 1. Rファイルの解析R
- 2. Javaでのテキストファイルの解析
- 3. テキストファイルの解析と名前の変更
- 4. テキストファイルの解析とCSVの生成
- 5. SonarQube 5.2の解析モード
- 6. テキストファイルの構文解析
- 7. 構文エラーと解析エラーの違い
- 8. 文字列の解析R
- 9. Rのクォート解析:Quantmodアプリケーション
- 10. テキストファイルの解析が次の行に移動しないとき
- 11. javascript/phpでのテキストファイルの解析?
- 12. CSVへのテキストファイルの解析C#
- 13. ウェブ解析とIE標準モード
- 14. R PCA解析エラー
- 15. LISP If文 - テキストファイルの構文解析
- 16. 解析複数のHTML /テキストファイルは
- 17. 複数のテキストファイルを解析するVBA?
- 18. テキストファイルのトークン化と解析(意思決定リストASCIIテキストファイルの編集)目的C
- 19. (R)ユニファイドプロセスとエクストリームプログラミングの違い
- 20. PIGローカルとmapreduceモードの違い
- 21. XMLフィードとXML文書の解析 - 違いは?
- 22. 動的バイナリ計測と解析の違い
- 23. XML ios 4とios 5の違いを解析するipad
- 24. XERCESで解析中にテキストファイルの解析エラーを出力する方法
- 25. C#でテキストファイルを解析する方法
- 26. javaでテキストファイルを解析するには?
- 27. ローカルRデータフレームとSparkRデータフレームとRDDとの違いと相違
- 28. 解析と、私は次の形式を持つテキストファイルから行を読み込むしたいテキストファイル
- 29. テキストファイルの複数のセクションを解析するC#
- 30. Pythonの!rと%rの違いは何ですか?
テキストファイルまたはバイナリファイルを読んでいますか? –
テキストファイル。しかし、何らかの理由で私はファイルをバイトストリームとして与えています。 – MxyL