J'ai un script qui lit dans un fichier csv avec des champs très énormes:
# 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)
Cependant, cela génère l'erreur suivante sur certains fichiers csv:
_csv.Error: field larger than field limit (131072)
Comment puis-je analyser des fichiers csv avec des champs énormes? Sauter les lignes avec des champs énormes n'est pas une option car les données doivent être analysées dans les étapes suivantes.
Réponses:
Le fichier csv peut contenir des champs très volumineux, augmentez donc
field_size_limit
:sys.maxsize
fonctionne pour Python 2.x et 3.x.sys.maxint
ne fonctionnerait qu'avec Python 2.x ( SO: what-is-sys-maxint-in-python-3 )Mettre à jour
Comme Geoff a fait remarquer, le code ci - dessus pourrait entraîner l'erreur suivante:
OverflowError: Python int too large to convert to C long
. Pour contourner cela, vous pouvez utiliser le code rapide et sale suivant (qui devrait fonctionner sur tous les systèmes avec Python 2 et Python 3):la source
maxInt = sys.maxsize
renvoie9223372036854775807L
ce qui entraîne par conséquent unTypeError: limit must be an integer
lors de l'appelcsv.field_size_limit(maxInt)
. Fait intéressant, l'utilisationmaxInt = int(sys.maxsize)
ne change pas cela. Une solution de contournement grossière consiste à simplifier l'utilisation,csv.field_size_limit(2147483647)
ce qui bien sûr cause des problèmes sur d'autres plates-formes. Dans mon cas, c'était suffisant pour identifier la valeur cassée dans le CSV, corriger les options d'exportation dans l'autre application et supprimer le besoin decsv.field_size_limit()
.Cela peut être dû au fait que votre fichier CSV a incorporé des guillemets simples ou doubles. Si votre fichier CSV est délimité par des tabulations, essayez de l'ouvrir en tant que:
la source
-u 3
option de ligne de commande, aka--quoting 3
Ci-dessous est de vérifier la limite actuelle
Sortie [20]: 131072
Ci-dessous est d'augmenter la limite. Ajoutez-le au code
Essayez de vérifier à nouveau la limite
Sortie [22]: 100000000
Maintenant, vous n'obtiendrez pas l'erreur "_csv.Error: champ plus grand que la limite de champ (131072)"
la source
La taille des champs csv est contrôlée via [Python 3.Docs]: csv. field_size_limit ( [new_limit] ) :
Il est défini par défaut sur 128k ou 0x20000 ( 131072 ), ce qui devrait être suffisant pour tout .csv décent :
Cependant, lorsque vous traitez un fichier .csv ( avec les guillemets et délimiteurs corrects ) ayant (au moins) un champ plus long que cette taille, l'erreur apparaît.
Pour se débarrasser de l'erreur, la taille limite doit être augmentée (pour éviter tout souci, la valeur maximale possible est tentée).
Dans les coulisses (vérifiez [GitHub]: python / cpython - (maître) cpython / Modules / _csv.c pour les détails d'implémentation), la variable qui contient cette valeur est un C long ( [Wikipedia]: types de données C ), dont la taille varie en fonction de l' architecture du processeur et du système d'exploitation ( I L P ). La différence classique: pour un OS 64 bits ( build Python ), la taille de type long ( en bits ) est:
Lorsque vous tentez de le définir, la nouvelle valeur est vérifiée pour être dans les limites longues , c'est pourquoi dans certains cas, une autre exception apparaît (ce cas est courant sur Win ):
Pour éviter de rencontrer ce problème, définissez la limite (maximale possible) ( LONG_MAX ) à l'aide d'un artifice (grâce à [Python 3.Docs]: ctypes - Une bibliothèque de fonctions étrangères pour Python ). Il devrait fonctionner sur Python 3 et Python 2 , sur n'importe quel CPU / OS .
Python 64 bits sur un système d'exploitation comme Nix :
Pour Python 32 bits , les choses sont uniformes: c'est le comportement rencontré sur Win .
Consultez les ressources suivantes pour plus de détails sur:
la source
Je venais juste de m'arriver sur un fichier CSV «simple». Certaines personnes pourraient l'appeler un fichier formaté non valide. Pas de caractères d'échappement, pas de guillemets doubles et le délimiteur était un point-virgule.
Un exemple de ligne de ce fichier ressemblerait à ceci:
la citation unique dans la deuxième cellule jetterait l'analyseur de ses rails. Ce qui a fonctionné était:
la source
Parfois, une ligne contient une colonne de guillemets doubles. Lorsque le lecteur csv essaie de lire cette ligne, la fin de la colonne n'est pas comprise et déclenche cette augmentation. La solution est ci-dessous:
la source
Vous pouvez utiliser
read_csv
frompandas
pour ignorer ces lignes.la source
pandas
inclut les lignes qui dépassent la limite de champ decsv
. Donc, si vous souhaitez ignorer ces lignes et lire d'autres lignes avec succès, vous pouvez utiliser cette solution. Sinon, lorsque des champs énormes vous sont nécessaires, l'augmentation de la limite de champ decsv.field_size_limit(100000000)
est appropriée.Recherchez le fichier cqlshrc généralement placé dans le répertoire .cassandra.
Dans ce fichier,
la source