パンダでタブ区切りファイルを読み取る-Windowsでは機能しますがMacでは機能しません


91

私は問題なくPandas / Pythonを使用してWindowsでタブ区切りのデータファイルを読んでいます。データファイルには、最初の3行にメモが含まれ、その後にヘッダーが続きます。

df = pd.read_csv(myfile,sep='\t',skiprows=(0,1,2),header=(0))

Macでこのファイルを読み取ろうとしています。(MacでPythonを初めて使用します。)次のエラーが発生します。

pandas.parser.CParserError: Error tokenizing data. C error: Expected 1
fields in line 8, saw 39

設定した場合error_bad_linesのための引数read_csv虚偽を、私は最後の行の終わりまで続く次の情報を、取得します。

Skipping line 8: expected 1 fields, saw 39
Skipping line 9: expected 1 fields, saw 125
Skipping line 10: expected 1 fields, saw 125
Skipping line 11: expected 1 fields, saw 125
Skipping line 12: expected 1 fields, saw 125
Skipping line 13: expected 1 fields, saw 125
Skipping line 14: expected 1 fields, saw 125
Skipping line 15: expected 1 fields, saw 125
Skipping line 16: expected 1 fields, saw 125
Skipping line 17: expected 1 fields, saw 125
...

エンコーディング引数の値を指定する必要がありますか?Windowsではファイルの読み取りが正常に機能するため、そうする必要はないようです。


両方のOSでまったく同じバージョンのパンダを使用していますか?Macの問題を説明するサンプルデータをいくつか提供できますか?
joris 2015年

無関係::(0)(0,)Pythonの違いを理解していますか?注:(0)ある0(0,)である0,-コンマが(空のものを除く)のタプルを作成し、括弧ではありません。
jfs 2015年

試しましたdf = pd.read_table(myfile, skiprows=[0,1,2], header=0)か?
pbreach 2015年

こんにちは、みんな。提案をありがとう。私は一時的な解決策を作成しましたが、この問題を再検討し、将来、より良い解決策を探す必要があるかもしれません。もしそうなら、私はあなたの提案をさらに調べます。私の一時的な解決策は、私が持っていた(そして以前にExcelを使用して問題のあるタブ区切りファイルに変換した)csvファイルを取得し、それをGoogleドキュメントで.tsvとして保存することでした。Gdocsを使用したのは、当時利用できる最も便利なドキュメントアプリケーションだったからです。この変換は機能しました。Pandasはファイルを正しく読み取ることができ、コードの残りの部分に進むことができたと思います。
user3062149 2015年

ここでMacで発生している問題は、ラインターミネータだと思います。Macで作成されたスプレッドシートは、Pythonのcsv_reader libを含むさまざまなライブラリであらゆる種類の楽しい動作を引き起こす可能性があります
ブラッドサンダース

回答:


146

最大の手がかりは、行がすべて1行で返されることです。これは、ラインターミネータが無視されているか、存在しないことを示します。

csv_readerの行末記号を指定できます。Macを使用している場合、作成される行\rはLinux標準ではなく、\nより適切には、ウィンドウのサスペンダーとベルトアプローチで終了します\r\n

pandas.read_csv(filename, sep='\t', lineterminator='\r')

コーデックパッケージを使用してすべてのデータを開くこともできます。これにより、ドキュメントの読み込み速度が犠牲になり、堅牢性が向上する可能性があります。

import codecs

doc = codecs.open('document','rU','UTF-16') #open for reading with "universal" type set

df = pandas.read_csv(doc, sep='\t')

3
コーデックのコードを追加することは私を助けました。次に、read_csvに同じことを行うパラメータがあることに気付きました。encoding = 'utf-16'を追加しましたが、問題が修正されました。
ミハイルベンコフ2017年

4

別のオプションはengine='python'、コマンドに追加することですpandas.read_csv(filename, sep='\t', engine='python')

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.