Lectura de archivos delimitados por tabulaciones con Pandas: funciona en Windows, pero no en Mac

91

He estado leyendo un archivo de datos delimitado por tabulaciones en Windows con Pandas / Python sin ningún problema. El archivo de datos contiene notas en las primeras tres líneas y luego sigue con un encabezado.

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

Ahora estoy tratando de leer este archivo con mi Mac. (La primera vez que uso Python en Mac). Recibo el siguiente error.

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

Si establezco el argumento error_bad_lines para read_csv en False , obtengo la siguiente información, que continúa hasta el final de la última fila.

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

¿Necesito especificar un valor para el argumento de codificación ? Parece que no debería tener que hacerlo porque leer el archivo funciona bien en Windows.

usuario3062149
fuente
¿Está utilizando exactamente la misma versión de pandas en ambos sistemas operativos? ¿Puede proporcionar algunos datos de muestra que ilustren el problema en Mac?
joris
no relacionado: ¿comprende la diferencia entre: (0)y (0,)en Python? Nota: (0)is 0y (0,)is 0,- coma crea una tupla (excepto una vacía), no paréntesis.
jfs
¿Usted ha intentado df = pd.read_table(myfile, skiprows=[0,1,2], header=0)?
pbreach
Hola a todos. Gracias por las sugerencias. Produje una solución temporal, pero es posible que deba volver a examinar este problema y buscar una mejor solución en el futuro. Si lo hago, analizaré más a fondo tu sugerencia. Mi solución temporal fue tomar el archivo csv que tenía (y que había convertido previamente al archivo delimitado por tabulaciones problemático usando Excel) y guardarlo como .tsv con Google docs. Usé Gdocs solo porque era la aplicación de documentos más conveniente disponible para mí en ese momento. Esta conversión funcionó. Pandas fue capaz de leer correctamente el archivo, creo, y pasar al resto de mi código.
user3062149
Sospecho que el problema que está viendo aquí con su mac son los terminadores de línea. Las hojas de cálculo creadas en una Mac pueden causar todo tipo de comportamientos divertidos con varias bibliotecas, incluida la biblioteca csv_reader en Python
brad sanders

Respuestas:

146

La pista más importante es que todas las filas se devuelven en una línea. Esto indica que los terminadores de línea se están ignorando o no están presentes.

Puede especificar el terminador de línea para csv_reader. Si está en una Mac, las líneas creadas terminarán con en \rlugar del estándar de Linux \no mejor aún con el enfoque de tirantes y cinturones de Windows \r\n.

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

También puede abrir todos sus datos utilizando el paquete de códecs. Esto puede aumentar la robustez a expensas de la velocidad de carga de documentos.

import codecs

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

df = pandas.read_csv(doc, sep='\t')
lijadoras de brad
fuente
3
La adición de un fragmento de código de códecs me ayudó. Luego me di cuenta de que hay un parámetro en read_csv que hace lo mismo. Agregué encoding = 'utf-16' y me solucionó el problema.
Mikhail Venkov
4

Otra opción sería agregar engine='python'al comandopandas.read_csv(filename, sep='\t', engine='python')

usuario3479780
fuente