Otrzymałem zakodowany tekst, ale nie wiem, jaki zestaw znaków został użyty. Czy istnieje sposób na określenie kodowania pliku tekstowego za pomocą Pythona? Jak mogę wykryć kodowanie / stronę kodową pliku tekstowego zajmującego się C #.
Otrzymałem zakodowany tekst, ale nie wiem, jaki zestaw znaków został użyty. Czy istnieje sposób na określenie kodowania pliku tekstowego za pomocą Pythona? Jak mogę wykryć kodowanie / stronę kodową pliku tekstowego zajmującego się C #.
Prawidłowe wykrycie kodowania przez cały czas jest niemożliwe .
(Z FAQ chardet :)
Jednak niektóre kodowania są zoptymalizowane dla określonych języków, a języki nie są losowe. Niektóre sekwencje postaci pojawiają się cały czas, podczas gdy inne sekwencje nie mają sensu. Osoba biegła w języku angielskim, która otworzy gazetę i znajdzie „txzqJv 2! Dasd0a QqdKjvz”, natychmiast rozpozna, że to nie jest angielski (nawet jeśli składa się wyłącznie z angielskich liter). Studiując wiele „typowych” tekstów, algorytm komputerowy może symulować tego rodzaju płynność i zgrabnie zgadywać o języku tekstu.
Istnieje biblioteka chardet, która wykorzystuje to badanie do próby wykrycia kodowania. chardet to port kodu automatycznego wykrywania w Mozilli.
Możesz także użyć UnicodeDammit . Spróbuje następujących metod:
chardet
referencje. Wydaje się być dobry, choć nieco powolny.Inną opcją do opracowania kodowania jest użycie libmagic (czyli kodu stojącego za poleceniem file ). Dostępnych jest wiele powiązań Pythona.
Powiązania Pythona, które istnieją w drzewie źródeł plików, są dostępne jako pakiet debian python-magic (lub python3-magic ). Może określić kodowanie pliku, wykonując:
Istnieje pipi o identycznej nazwie, ale niekompatybilny, python-magic pip, który również używa
libmagic
. Może również uzyskać kodowanie, wykonując:źródło
libmagic
jest rzeczywiście realną alternatywą dlachardet
. I świetne informacje o nazwanych pakietachpython-magic
! Jestem pewien, że ta dwuznaczność gryzie wielu ludzifile
nie jest szczególnie dobry w rozpoznawaniu ludzkiego języka w plikach tekstowych. Doskonale nadaje się do identyfikowania różnych formatów kontenerów, chociaż czasami musisz wiedzieć, co to znaczy („dokument Microsoft Office” może oznaczać wiadomość programu Outlook itp.).open()
:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 169799: invalid start byte
. Kodowanie plików według vima:set fileencoding
tolatin1
.errors='ignore'
, wynik kodu przykładowego jest mniej pomocnybinary
.Niektóre strategie kodowania, proszę odkomentować do smaku:
Może chcesz sprawdzić kodowanie, otwierając i odczytując plik w formie pętli ... ale może być konieczne najpierw sprawdzenie rozmiaru pliku:
źródło
io
, jakio.open(filepath, 'r', encoding='utf-8')
, co jest wygodniejsze, ponieważcodecs
nie konwertuje się\n
automatycznie podczas czytania i pisania. Więcej na TUTAJOto przykład odczytu i wzięcia pod uwagę
chardet
prognozy kodowania, czytanian_lines
z pliku w przypadku, gdy jest on duży.chardet
daje również prawdopodobieństwo (tj.confidence
) przewidywania kodowania (nie spojrzałem, jak oni to wymyślili), które jest zwracane wraz z jego przewidywaniemchardet.predict()
, więc możesz to w jakiś sposób wykorzystać, jeśli chcesz.źródło
def predict_encoding(file_path, n=20): ... skip ... and then rawdata = b''.join([f.read() for _ in range(n)])
wypróbowałem tę funkcję w Pythonie 3.6, działał doskonale z kodowaniem „ascii”, „cp1252”, „utf-8”, „Unicode”. To zdecydowanie jest pozytywne.źródło
W zależności od twojej platformy, po prostu wybrałem
file
polecenie powłoki Linux . Działa to dla mnie, ponieważ używam go w skrypcie, który działa wyłącznie na jednym z naszych komputerów z systemem Linux.Oczywiście nie jest to idealne rozwiązanie ani odpowiedź, ale można je zmodyfikować w celu dopasowania do Twoich potrzeb. W moim przypadku muszę tylko ustalić, czy plik to UTF-8, czy nie.
źródło
To może być pomocne
źródło
Zasadniczo niemożliwe jest określenie kodowania pliku tekstowego, w ogólnym przypadku. Więc nie, nie ma standardowej biblioteki Pythona, która mogłaby to dla Ciebie zrobić.
Jeśli masz bardziej szczegółową wiedzę na temat pliku tekstowego (np. Że jest to XML), mogą istnieć funkcje biblioteczne.
źródło
Jeśli znasz pewną zawartość pliku, możesz spróbować go zdekodować za pomocą kilku kodowań i zobaczyć, którego brakuje. W ogóle nie ma mowy, ponieważ plik tekstowy jest plikiem tekstowym, a te są głupie;)
źródło
Ta strona ma kod Pythona do rozpoznawania ascii, kodowania za pomocą boms i utf8 no bom: https://unicodebook.readthedocs.io/guess_encoding.html . Wczytaj plik do tablicy bajtów (dane): http://www.codecodex.com/wiki/Read_a_file_into_a_byte_array . Oto przykład. Jestem w OSX.
źródło