Membaca file tab-delimited dengan Pandas - berfungsi di Windows, tetapi tidak di Mac

91

Saya telah membaca file data tab-delimited di Windows dengan Pandas / Python tanpa masalah. File data berisi catatan dalam tiga baris pertama dan kemudian diikuti dengan header.

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

Sekarang saya mencoba membaca file ini dengan Mac saya. (Pertama kali saya menggunakan Python di Mac.) Saya mendapatkan error berikut.

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

Jika menyetel argumen error_bad_lines untuk read_csv ke False , saya mendapatkan informasi berikut, yang berlanjut hingga akhir baris terakhir.

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
...

Apakah saya perlu menentukan nilai untuk argumen pengkodean ? Sepertinya saya tidak perlu melakukannya karena membaca file berfungsi dengan baik di Windows.

pengguna3062149
sumber
Apakah Anda menggunakan versi panda yang sama persis di kedua OS? Dapatkah Anda memberikan beberapa contoh data yang menggambarkan masalah di Mac?
joris
tidak terkait: apakah Anda memahami perbedaan antara: (0)dan (0,)dengan Python? Catatan: (0)is 0dan (0,)is 0,- koma membuat tupel (kecuali yang kosong), bukan tanda kurung.
jfs
Apakah Anda mencoba df = pd.read_table(myfile, skiprows=[0,1,2], header=0)?
pbreach
Halo semua. Terima kasih atas sarannya. Saya membuat solusi sementara tetapi mungkin perlu meninjau kembali masalah ini dan mencari solusi yang lebih baik di masa mendatang. Jika dan ketika saya melakukannya, saya akan melihat lebih jauh saran Anda. Solusi sementara saya adalah mengambil file csv yang saya miliki (dan sebelumnya telah dikonversi ke file tab delimited yang bermasalah menggunakan Excel) dan menyimpannya sebagai .tsv dengan Google docs. Saya menggunakan Gdocs hanya karena itu adalah aplikasi dokumen paling nyaman yang tersedia untuk saya saat itu. Konversi ini berhasil. Saya yakin Panda dapat membaca file dengan benar, dan melanjutkan ke kode saya yang lain.
pengguna3062149
Saya menduga masalah yang Anda lihat di sini dengan mac Anda adalah terminator baris. Spreadsheet yang dibuat di mac dapat menyebabkan segala macam perilaku menyenangkan dengan berbagai perpustakaan, termasuk lib csv_reader dengan python
brad sanders

Jawaban:

146

Petunjuk terbesar adalah semua baris dikembalikan dalam satu baris. Ini menunjukkan terminator baris sedang diabaikan atau tidak ada.

Anda dapat menentukan terminator baris untuk csv_reader. Jika Anda menggunakan Mac, garis yang dibuat akan berakhir dengan \rdaripada standar linux \natau lebih baik lagi dengan pendekatan suspender dan sabuk jendela \r\n.

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

Anda juga dapat membuka semua data Anda menggunakan paket codec. Ini dapat meningkatkan ketahanan dengan mengorbankan kecepatan pemuatan dokumen.

import codecs

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

df = pandas.read_csv(doc, sep='\t')
brad sanders
sumber
3
Potongan kode codec yang ditambahkan membantu saya. Kemudian saya menyadari ada parameter di read_csv yang melakukan hal yang sama. Saya telah menambahkan encoding = 'utf-16' dan itu memperbaiki masalah saya.
Mikhail Venkov
4

Pilihan lain adalah menambahkan engine='python'perintahpandas.read_csv(filename, sep='\t', engine='python')

pengguna3479780
sumber