La taille des champs csv est contrôlée via [Python 3.Docs]: csv. field_size_limit ( [new_limit] ) :
Renvoie la taille de champ maximale actuelle autorisée par l'analyseur. Si new_limit est donné, cela devient la nouvelle limite.
Il est défini par défaut sur 128k ou 0x20000 ( 131072 ), ce qui devrait être suffisant pour tout .csv décent :
>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'
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 ):
>>> import sys
>>>
>>> sys.platform, sys.maxsize
('win32', 9223372036854775807)
>>>
>>> csv.field_size_limit(sys.maxsize)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long
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 .
>>> import ctypes as ct
>>>
>>> csv.field_size_limit(int(ct.c_ulong(-1).value // 2))
131072
>>> limit1 = csv.field_size_limit()
>>> limit1
2147483647
>>> "0x{0:016X}".format(limit1)
'0x000000007FFFFFFF'
Python 64 bits sur un système d'exploitation comme Nix :
>>> import sys, csv, ctypes as ct
>>>
>>> sys.platform, sys.maxsize
('linux', 9223372036854775807)
>>>
>>> csv.field_size_limit()
131072
>>>
>>> csv.field_size_limit(int(ct.c_ulong(-1).value // 2))
131072
>>> limit1 = csv.field_size_limit()
>>> limit1
9223372036854775807
>>> "0x{0:016X}".format(limit1)
'0x7FFFFFFFFFFFFFFF'
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: