Mam skrypt do odczytu w pliku csv z bardzo dużymi polami:
# 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)
Jednak powoduje to następujący błąd w niektórych plikach csv:
_csv.Error: field larger than field limit (131072)
Jak mogę analizować pliki csv z dużymi polami? Pomijanie wierszy z dużymi polami nie jest opcją, ponieważ dane należy analizować w kolejnych krokach.
Odpowiedzi:
Plik csv może zawierać bardzo duże pola, dlatego zwiększ
field_size_limit
:sys.maxsize
działa dla Python 2.xi 3.x.sys.maxint
działa tylko z Python 2.x ( SO: what-is-sys-maxint-in-python-3 )Aktualizacja
Jak Geoff zauważył, powyższy kod może spowodować następujący błąd:
OverflowError: Python int too large to convert to C long
. Aby to obejść, możesz użyć następującego szybkiego i brudnego kodu (który powinien działać na każdym systemie z Python 2 i Python 3):źródło
maxInt = sys.maxsize
zwraca,9223372036854775807L
co w konsekwencji powodujeTypeError: limit must be an integer
wywołanie podczascsv.field_size_limit(maxInt)
. Co ciekawe, używaniemaxInt = int(sys.maxsize)
tego nie zmienia. Prostym obejściem jest uproszczone użycie,csv.field_size_limit(2147483647)
które oczywiście powoduje problemy na innych platformach. W moim przypadku było to adekwatne do zidentyfikowania zepsutej wartości w pliku CSV, ustalenia opcji eksportu w drugiej aplikacji i usunięcia potrzebycsv.field_size_limit()
.Może to być spowodowane tym, że plik CSV ma osadzone pojedyncze lub podwójne cudzysłowy. Jeśli plik CSV jest rozdzielany tabulatorami, spróbuj go otworzyć jako:
źródło
-u 3
opcji wiersza polecenia, alias--quoting 3
Poniżej znajduje się sprawdzenie aktualnego limitu
Out [20]: 131072
Poniżej jest zwiększenie limitu. Dodaj to do kodu
Spróbuj ponownie sprawdzić limit
Out [22]: 100000000
Teraz nie pojawi się błąd „_csv.Error: pole większe niż limit pola (131072)”
źródło
Rozmiary pól csv są kontrolowane przez [Python 3.Docs]: csv. field_size_limit ( [new_limit] ) :
Domyślnie jest ustawiony na 128k lub 0x20000 ( 131072 ), co powinno wystarczyć dla każdego porządnego pliku .csv :
Jednak w przypadku pliku .csv ( z poprawnym cytowaniem i separatorem ) mającego (przynajmniej) jedno pole dłuższe niż ten rozmiar, pojawia się błąd.
Aby pozbyć się błędu, należy zwiększyć limit rozmiaru (aby uniknąć obaw, próbowana jest maksymalna możliwa wartość).
Za kulisami (sprawdź [GitHub]: python / cpython - (master) cpython / Modules / _csv.c, aby uzyskać szczegółowe informacje na temat implementacji), zmienna przechowująca tę wartość ma długość C ( [Wikipedia]: typy danych C ), której rozmiar różni się w zależności od architektury procesora i systemu operacyjnego ( I L P ). Klasyczna różnica: w 64-bitowym systemie operacyjnym ( kompilacja w języku Python ) długi rozmiar czcionki ( w bitach ) wynosi:
Podczas próby jego ustawienia sprawdza się, czy nowa wartość znajduje się w długich granicach, dlatego w niektórych przypadkach pojawia się inny wyjątek (ten przypadek jest powszechny w Win ):
Aby uniknąć tego problemu, ustaw limit (maksymalny możliwy) ( LONG_MAX ) przy użyciu sztuczki (dzięki [Python 3.Docs]: ctypes - Biblioteka funkcji obcych dla Pythona ). Powinien działać na Python 3 i Python 2 na dowolnym procesorze / systemie operacyjnym .
64bit Python na Nix jak OS :
W 32-bitowym Pythonie rzeczy są jednolite: takie zachowanie występuje w Win .
Sprawdź następujące zasoby, aby uzyskać więcej informacji na temat:
źródło
Właśnie to mi się przydarzyło w „zwykłym” pliku CSV. Niektóre osoby mogą nazwać to niepoprawnie sformatowanym plikiem. Brak znaków specjalnych, brak podwójnych cudzysłowów i separator były średnikami.
Przykładowa linia z tego pliku wyglądałaby następująco:
pojedynczy cytat w drugiej komórce zrzuciłby parser z szyn. Zadziałało:
źródło
Czasami wiersz zawiera kolumnę podwójnego cudzysłowu. Gdy czytnik csv spróbuje przeczytać ten wiersz, nie rozumiem końca kolumny i odpal tę podwyżkę. Rozwiązanie jest poniżej:
źródło
Możesz użyć
read_csv
od,pandas
aby pominąć te linie.źródło
pandas
obejmuje wiersze przekraczające limit pola wynoszącycsv
. Jeśli więc chcesz pominąć te linie i przeczytać inne, możesz skorzystać z tego rozwiązania. W przeciwnym razie, gdy wymagane są ogromne pola,csv.field_size_limit(100000000)
właściwe jest zwiększenie limitu pól o .Znajdź plik cqlshrc zwykle umieszczony w katalogu .cassandra.
W tym pliku dołącz
źródło