Tengo un script que lee en un archivo csv con campos muy grandes:
# example from http://docs.python.org/3.3/library/csv.html?highlight=csv%20dictreader#examples
import csv
with open('some.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
Sin embargo, esto arroja el siguiente error en algunos archivos csv:
_csv.Error: field larger than field limit (131072)
¿Cómo puedo analizar archivos csv con grandes campos? Saltar las líneas con campos enormes no es una opción, ya que los datos deben analizarse en los pasos posteriores.
Respuestas:
El archivo csv puede contener campos muy grandes, por lo tanto, aumente
field_size_limit
:sys.maxsize
funciona para Python 2.xy 3.x.sys.maxint
solo funcionaría con Python 2.x ( SO: what-is-sys-maxint-in-python-3 )Actualizar
Como se señaló Geoff, el código anterior podría resultar en el siguiente error:
OverflowError: Python int too large to convert to C long
. Para evitar esto, puede usar el siguiente código rápido y sucio (que debería funcionar en todos los sistemas con Python 2 y Python 3):fuente
maxInt = sys.maxsize
devuelve lo9223372036854775807L
que en consecuencia da como resultado unaTypeError: limit must be an integer
llamadacsv.field_size_limit(maxInt)
. Curiosamente, el usomaxInt = int(sys.maxsize)
no cambia esto. Una solución alternativa cruda es el uso simplecsv.field_size_limit(2147483647)
que, por supuesto, causa problemas en otras plataformas. En mi caso, esto se adquirió para identificar el valor roto en el CSV, corregir las opciones de exportación en la otra aplicación y eliminar la necesidad decsv.field_size_limit()
.Esto podría deberse a que su archivo CSV tiene comillas simples o dobles incrustadas. Si su archivo CSV está delimitado por tabulaciones, intente abrirlo como:
fuente
-u 3
opción de línea de comandos, también conocido como--quoting 3
A continuación se muestra el límite actual.
Fuera [20]: 131072
A continuación se muestra para aumentar el límite. Agréguelo al código
Intenta verificar el límite nuevamente
Fuera [22]: 100000000
Ahora no obtendrá el error "_csv.Error: campo mayor que el límite de campo (131072)"
fuente
Los tamaños de campo csv se controlan a través de [Python 3.Docs]: csv. field_size_limit ( [new_limit] ) :
Está configurado de forma predeterminada en 128k o 0x20000 ( 131072 ), lo que debería ser suficiente para cualquier .csv decente:
Sin embargo, cuando se trata de un archivo .csv ( con el delimitador y las comillas correctas ) que tiene (al menos) un campo más largo que este tamaño, aparece el error.
Para deshacerse del error, se debe aumentar el límite de tamaño (para evitar preocupaciones, se intenta el valor máximo posible).
Detrás de escena (marque [GitHub]: python / cpython - (master) cpython / Modules / _csv.c para detalles de implementación), la variable que contiene este valor es una C larga ( [Wikipedia]: tipos de datos C ), cuyo tamaño varía según la arquitectura de la CPU y el sistema operativo ( I L P ). La diferencia clásica: para un 64bit SO de ( compilación de Python ), el tamaño de letra largo ( en bits ) es:
Al intentar establecerlo, se verifica que el nuevo valor esté en límites largos , por eso en algunos casos aparece otra excepción (este caso es común en Win ):
Para evitar encontrarse con este problema, establezca el límite (máximo posible) ( LONG_MAX ) utilizando un artificio (gracias a [Python 3.Docs]: ctypes - Una biblioteca de funciones foráneas para Python ). Debería funcionar en Python 3 y Python 2 , en cualquier CPU / OS .
Python de 64 bits en un Nix como SO :
Para Python de 32 bits , las cosas son uniformes: es el comportamiento encontrado en Win .
Consulte los siguientes recursos para obtener más detalles sobre:
fuente
Me acaba de suceder esto en un archivo CSV 'normal'. Algunas personas pueden llamarlo un archivo con formato no válido. Sin caracteres de escape, sin comillas dobles y delimitador era un punto y coma.
Una línea de muestra de este archivo se vería así:
la comilla simple en la segunda celda arrojaría al analizador de sus rieles. Lo que funcionó fue:
fuente
A veces, una fila contiene una columna de comillas dobles. Cuando el lector csv intente leer esta fila, no se comprende el final de la columna y dispare este aumento. La solución está abajo:
fuente
Puede usar
read_csv
desdepandas
para omitir estas líneas.fuente
pandas
incluye las filas que exceden el límite de campo decsv
. Por lo tanto, si desea omitir estas líneas y leer otras líneas con éxito, puede usar esta solución. De lo contrario, cuando se requieren campos enormes para usted,csv.field_size_limit(100000000)
es apropiado aumentar el límite de campo en .Busque el archivo cqlshrc que generalmente se encuentra en el directorio .cassandra.
En ese archivo adjunto,
fuente