/ / Odczytaj plik w pythonie, który ma fałszywy bajt 0xc0, który powoduje, że utf-8 i ascii się wychodzą - python, python-3.x, pandas, csv, iso

Czytaj plik w pythonie z błędnym bajtem 0xc0, który powoduje błąd UTF-8 i ascii - python, python-3.x, pandy, csv, iso

Próbuję odczytać plik rozdzielony tabulatorami w ramce danych pand:

>>> df = pd.read_table(fn , na_filter=False, error_bad_lines=False)

Występują błędy:

b"Skipping line 58: expected 11 fields, saw 12n"
Traceback (most recent call last):
...(many lines)...
UnicodeDecodeError: "utf-8" codec can"t decode byte 0xc0 in position 115: invalid start byte

Wydaje się, że bajt 0xc0 powoduje ból zarówno w kodowaniu utf-8, jak i ascii.

>>> df = pd.read_table(fn , na_filter=False, error_bad_lines=False, encoding="ascii")
...(many lines)...
UnicodeDecodeError: "ascii" codec can"t decode byte 0xc0 in position 115: ordinal not in range(128)

Wpadłem na te same problemy z czytnikiem modułu csv.
Jeśli zaimportuję plik do OpenOffice Calc, tozostanie poprawnie zaimportowany, kolumny zostaną poprawnie rozpoznane itd. Prawdopodobnie obraźliwy bajt 0xc0 jest tam ignorowany. To nie jest jakaś ważna część danych itp., Prawdopodobnie jest to zwykły błąd zapisu przez system, który wygenerował ten plik. Cieszę się, że uda mi się nawet przeskoczyć linię, w której się pojawi. Chcę tylko przeczytać plik w programie Pythona. The error_bad_lines=False opcja pand powinna była się tym zająćproblem, ale bez kości. Ponadto plik NIE zawiera żadnych treści w skryptach innych niż angielski, co czyni kod Unicode tak niezbędnym. To wszystkie standardowe angielskie litery i cyfry. Próbowałem również utf-16 utf-32 itd., Ale powodowały one więcej błędów.

Jak zrobić python (w szczególności pandas Dataframe) odczytać plik zawierający jeden lub więcej fałszywych bajtów 0xc0 znaków?

Odpowiedzi:

1 dla odpowiedzi № 1

Przeniesienie tej odpowiedzi tutaj z innego miejsca gdzie dostał wrogie przyjęcie.

Znaleziono jeden standard który faktycznie akceptuje (co oznacza, że ​​„t błąd nie występuje”) bajt 0xc0:

encoding="ISO-8859-1"

Uwaga: Wymaga to upewnienia się, że reszta pliku nie ma znaków Unicode. Może to być pomocne dla ludzi takich jak ja, którzy i tak nie mieli żadnych znaków Unicode w swoim pliku i po prostu chcieli, żeby python załadował to cholerstwo i oba utf-8 i kodowania ascii były błędne.

Więcej na temat ISO-8859-1: Jaka jest różnica między utf-8 i ISO-8859-1?

Nowe polecenie, które działa:

>>> df = pd.read_table(fn , na_filter=False, error_bad_lines=False, encoding="ISO-8859-1")

Po przeczytaniu, ramka danych jest w porządku, kolumny, dane działają tak jak w OpenOffice Calc. Nadal nie mam pojęcia, gdzie się narusza 0xc0 bajt poszedł, ale to nie ma znaczenia, ponieważ mam potrzebne dane.