Lettura di file delimitati da tabulazioni con Panda: funziona su Windows, ma non su Mac


95

Ho letto un file di dati delimitato da tabulazioni in Windows con Pandas / Python senza problemi. Il file di dati contiene note nelle prime tre righe e quindi segue con un'intestazione.

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

Ora sto cercando di leggere questo file con il mio Mac. (La prima volta che uso Python su Mac.) Ottengo il seguente errore.

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

Se si imposta l' argomento error_bad_lines per read_csv su False , ottengo le seguenti informazioni, che continuano fino alla fine dell'ultima riga.

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

Devo specificare un valore per l' argomento di codifica ? Sembra che non dovrei farlo perché la lettura del file funziona bene su Windows.


Stai usando la stessa identica versione di panda su entrambi i sistemi operativi? Potete fornire alcuni dati di esempio che illustrino il problema su Mac?
joris

non correlato: capisci la differenza tra: (0)e (0,)in Python? Nota: (0)è 0ed (0,)è 0,- la virgola crea una tupla (tranne una vuota), non le parentesi.
jfs

Hai provato df = pd.read_table(myfile, skiprows=[0,1,2], header=0)?
pbreach il

Ciao a tutti. Grazie per i suggerimenti. Ho prodotto una soluzione temporanea ma potrebbe essere necessario rivedere questo problema e cercare una soluzione migliore in futuro. Se e quando lo farò approfondirò il tuo suggerimento. La mia soluzione temporanea era quella di prendere il file csv che avevo (e che avevo precedentemente convertito nel file problematico delimitato da tabulazioni utilizzando Excel) e salvarlo come .tsv con Google Docs. Ho usato Gdocs solo perché era l'applicazione per documenti più conveniente a mia disposizione all'epoca. Questa conversione ha funzionato. Pandas è stato in grado di leggere correttamente il file, credo, e passare al resto del mio codice.
user3062149

Sospetto che il problema che stai riscontrando qui con il tuo Mac sia i terminatori di linea. I fogli di calcolo creati su un Mac possono causare tutti i tipi di comportamenti divertenti con varie librerie, inclusa la libreria csv_reader in python
brad sanders

Risposte:


153

L'indizio più grande è che le righe vengono restituite tutte su una riga. Ciò indica che i terminatori di riga vengono ignorati o non sono presenti.

È possibile specificare il terminatore di riga per csv_reader. Se sei su un Mac le linee create finiranno con \rpiuttosto che con lo standard Linux \no meglio ancora con le bretelle e l'approccio a cintura di Windows con \r\n.

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

Puoi anche aprire tutti i tuoi dati usando il pacchetto codecs. Ciò può aumentare la robustezza a scapito della velocità di caricamento del documento.

import codecs

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

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

4
L'aggiunta di codec di codice mi ha aiutato. Poi ho capito che c'è un parametro in read_csv che fa lo stesso. Ho aggiunto encoding = 'utf-16' e ha risolto il problema per me.
Mikhail Venkov

5

Un'altra opzione potrebbe essere quella di aggiungere engine='python'al comandopandas.read_csv(filename, sep='\t', engine='python')

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.