Mendeteksi pengkodean dengan benar setiap saat adalah hal yang mustahil .
(Dari FAQ chardet :)
Namun, beberapa penyandian dioptimalkan untuk bahasa tertentu, dan bahasa tidak acak. Beberapa urutan karakter muncul setiap saat, sementara urutan lainnya tidak masuk akal. Seseorang yang fasih berbahasa Inggris yang membuka surat kabar dan menemukan "txzqJv 2! Dasd0a QqdKjvz" akan langsung mengenali bahwa itu bukan bahasa Inggris (meskipun seluruhnya terdiri dari huruf-huruf bahasa Inggris). Dengan mempelajari banyak teks "khas", algoritma komputer dapat mensimulasikan kefasihan jenis ini dan membuat tebakan yang berpendidikan tentang bahasa teks.
Ada perpustakaan chardet yang menggunakan studi itu untuk mencoba mendeteksi pengkodean. chardet adalah port dari kode deteksi otomatis di Mozilla.
Anda juga dapat menggunakan UnicodeDammit . Ini akan mencoba metode berikut:
- Pengkodean ditemukan dalam dokumen itu sendiri: misalnya, dalam deklarasi XML atau (untuk dokumen HTML) tag META http-equiv. Jika Beautiful Soup menemukan penyandian semacam ini di dalam dokumen, itu mem-parsing dokumen itu lagi dari awal dan mencoba mencoba penyandian yang baru. Satu-satunya pengecualian adalah jika Anda secara eksplisit menentukan suatu pengkodean, dan pengkodean itu benar-benar berfungsi: maka ia akan mengabaikan segala pengodean yang ditemukan dalam dokumen.
- Pengkodean mengendus dengan melihat beberapa byte pertama file. Jika suatu pengkodean terdeteksi pada tahap ini, itu akan menjadi salah satu pengkodean UTF- *, EBCDIC, atau ASCII.
- Pengkodean didengus oleh pustaka chardet , jika Anda sudah menginstalnya.
- UTF-8
- Windows-1252
chardet
referensi. Tampak bagus, meski agak lambat.Pilihan lain untuk menyelesaikan encoding adalah menggunakan libmagic (yang merupakan kode di belakang perintah file ). Ada banyak sekali ikatan python yang tersedia.
Ikatan python yang hidup di pohon sumber file tersedia sebagai paket debian python-magic (atau python3-magic ). Itu dapat menentukan penyandian file dengan melakukan:
Ada paket pip python-magic yang bernama, tetapi tidak kompatibel pada pypi yang juga menggunakan
libmagic
. Itu juga bisa mendapatkan encoding, dengan melakukan:sumber
libmagic
memang alternatif yang layak untukchardet
. Dan info hebat tentang paket berbeda bernamapython-magic
! Saya yakin ambiguitas ini menggigit banyak orangfile
tidak terlalu pandai mengidentifikasi bahasa manusia dalam file teks. Ini sangat baik untuk mengidentifikasi berbagai format wadah, meskipun Anda kadang-kadang harus tahu apa artinya ("dokumen Microsoft Office" dapat berarti pesan Outlook, dll).open()
:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 169799: invalid start byte
. Pengkodean file menurut vim:set fileencoding
adalahlatin1
.errors='ignore'
, output dari kode contoh kurang bermanfaatbinary
.Beberapa strategi penyandian, harap batalkan komentar untuk mencicipi:
Anda mungkin ingin memeriksa penyandian dengan membuka dan membaca file dalam bentuk loop ... tetapi Anda mungkin perlu memeriksa ukuran file terlebih dahulu:
sumber
io
, sepertiio.open(filepath, 'r', encoding='utf-8')
, yang lebih nyaman, karenacodecs
tidak mengkonversi\n
secara otomatis pada membaca dan menulis. Lebih lanjut tentang DI SINIBerikut adalah contoh membaca dan menerima
chardet
prediksi pengkodean dengan nilai nominal , membacan_lines
dari file jika besar.chardet
juga memberi Anda kemungkinan (yaituconfidence
) dari prediksi pengkodean itu (belum melihat bagaimana mereka datang dengan itu), yang dikembalikan dengan prediksi darichardet.predict()
, sehingga Anda dapat bekerja dalam entah bagaimana jika Anda suka.sumber
def predict_encoding(file_path, n=20): ... skip ... and then rawdata = b''.join([f.read() for _ in range(n)])
Telah mencoba fungsi ini pada Python 3.6, bekerja dengan sempurna dengan "ascii", "cp1252", "utf-8", "unicode" encodings. Jadi ini jelas upvote.sumber
Tergantung pada platform Anda, saya hanya memilih untuk menggunakan
file
perintah shell linux . Ini berfungsi untuk saya karena saya menggunakannya dalam skrip yang secara eksklusif berjalan di salah satu mesin linux kami.Jelas ini bukan solusi atau jawaban yang ideal, tetapi bisa dimodifikasi agar sesuai dengan kebutuhan Anda. Dalam kasus saya, saya hanya perlu menentukan apakah suatu file adalah UTF-8 atau tidak.
sumber
Ini mungkin bermanfaat
sumber
Pada prinsipnya, tidak mungkin untuk menentukan pengkodean file teks, dalam kasus umum. Jadi tidak, tidak ada perpustakaan Python standar untuk melakukan itu untuk Anda.
Jika Anda memiliki pengetahuan yang lebih spesifik tentang file teks (mis. Itu XML), mungkin ada fungsi perpustakaan.
sumber
Jika Anda mengetahui beberapa konten file, Anda dapat mencoba mendekodekannya dengan beberapa penyandian dan melihat mana yang hilang. Secara umum tidak ada cara karena file teks adalah file teks dan itu bodoh;)
sumber
Situs ini memiliki kode python untuk mengenali ascii, pengodean dengan boms, dan utf8 no bom: https://unicodebook.readthedocs.io/guess_encoding.html . Baca file ke dalam array byte (data): http://www.codecodex.com/wiki/Read_a_file_into_a_byte_array . Ini sebuah contoh. Saya di osx.
sumber