Определить кодировку текста в Python
Я получил некоторый текст, который закодирован, но я не знаю, какая кодировка была использована. Есть ли способ определить кодировку текстового файла с помощью Python? Как я могу определить кодировку / кодовую страницу текстового файла имеет дело с C#.
8 ответов:
правильное обнаружение кодировки все время невозможно.
(из CHARDET FAQ:)
однако некоторые кодировки оптимизированы для конкретных языков и языков они не случайны. Некоторый символ последовательности всплывают все время, в то время как другие последовательности не имеют смысла. Один человек свободно владеет английским языком, который открывает газета и находит "txzqJv 2!dasd0a QqdKjvz " мгновенно распознает это это не английский (хотя это полностью состоит из английских букв). Изучая множество "типичных" текстов, а компьютерный алгоритм может имитировать это вид беглости и сделать образованным угадайте о языке текста.
есть chardet библиотека, которая использует это исследование, чтобы попытаться определить кодировку. chardet-это порт кода автоматического обнаружения в Mozilla.
вы также можете использовать UnicodeDammit. Он будет пытаться в следующем методы:
- кодировка, обнаруженная в самом документе: например, в объявлении XML или (для документов HTML) метатеге http-equiv. Если Beautiful Soup находит такую кодировку в документе, он снова анализирует документ с самого начала и дает новую кодировку попробовать. Единственное исключение - если вы явно указали кодировку, и эта кодировка действительно работала: тогда она будет игнорировать любую кодировку, которую она находит в документе.
- An кодировка понюхала, посмотрев на первые несколько байт файла. Если кодировка обнаружена на этом этапе, это будет одна из кодировок UTF -*, EBCDIC или ASCII.
- кодировка понюхал chardet библиотека, если она установлена.
- UTF-8
- Windows-1252
еще один вариант для разработки кодировки-использовать libmagic (который является кодом file). Есть обилие доступны привязки python.
привязки python, которые живут в дереве исходного файла, доступны в виде python-magic (или python3-magic) пакет Debian. Если можно определить кодировку файла, выполнив:
import magic blob = open('unknown-file').read() m = magic.open(magic.MAGIC_MIME_ENCODING) m.load() encoding = m.buffer(blob) # "utf-8" "us-ascii" etc
есть тождественно названный, но несовместимо,python-magic pip пакет на pypi, который также использует libmagic. Он также может получить кодировку, выполнив:
import magic blob = open('unknown-file').read() m = magic.Magic(mime_encoding=True) encoding = m.from_buffer(blob)
Некоторые стратегии кодирования, пожалуйста, раскомментируйте по вкусу :
#!/bin/bash # tmpfile= echo '-- info about file file ........' file -i $tmpfile enca -g $tmpfile echo 'recoding ........' #iconv -f iso-8859-2 -t utf-8 back_test.xml > $tmpfile #enca -x utf-8 $tmpfile #enca -g $tmpfile recode CP1250..UTF-8 $tmpfile
вы можете проверить кодировку, открыв и прочитав файл в виде цикла... но вам может понадобиться сначала проверить размер файла:
encodings = ['utf-8', 'windows-1250', 'windows-1252' ...etc] for e in encodings: try: fh = codecs.open('file.txt', 'r', encoding=e) fh.readlines() fh.seek(0) except UnicodeDecodeError: print('got unicode error with %s , trying different encoding' % e) else: print('opening the file with encoding: %s ' % e) break
вот пример чтения и принятия за чистую монету a
chardet
кодирование предсказания, чтениеn_lines
из файла в случае, если он большой.
chardet
также дает вам вероятность (т. е.confidence
) его кодирования предсказания (не смотрел, как они приходят с этим), который возвращается с его предсказанием отchardet.predict()
, так что вы могли бы работать, что-то, если вам нравится.def predict_encoding(file_path, n_lines=20): '''Predict a file's encoding using chardet''' import chardet # Open the file as binary data with open(file_path, 'rb') as f: # Join binary lines for specified number of lines rawdata = b''.join([f.readline() for _ in range(n_lines)]) return chardet.detect(rawdata)['encoding']
# Function: OpenRead(file) # A text file can be encoded using: # (1) The default operating system code page, Or # (2) utf8 with a BOM header # # If a text file is encoded with utf8, and does not have a BOM header, # the user can manually add a BOM header to the text file # using a text editor such as notepad++, and rerun the python script, # otherwise the file is read as a codepage file with the # invalid codepage characters removed import sys if int(sys.version[0]) != 3: print('Aborted: Python 3.x required') sys.exit(1) def bomType(file): """ returns file encoding string for open() function EXAMPLE: bom = bomtype(file) open(file, encoding=bom, errors='ignore') """ f = open(file, 'rb') b = f.read(4) f.close() if (b[0:3] == b'\xef\xbb\xbf'): return "utf8" # Python automatically detects endianess if utf-16 bom is present # write endianess generally determined by endianess of CPU if ((b[0:2] == b'\xfe\xff') or (b[0:2] == b'\xff\xfe')): return "utf16" if ((b[0:5] == b'\xfe\xff\x00\x00') or (b[0:5] == b'\x00\x00\xff\xfe')): return "utf32" # If BOM is not provided, then assume its the codepage # used by your operating system return "cp1252" # For the United States its: cp1252 def OpenRead(file): bom = bomType(file) return open(file, 'r', encoding=bom, errors='ignore') ####################### # Testing it ####################### fout = open("myfile1.txt", "w", encoding="cp1252") fout.write("* hi there (cp1252)") fout.close() fout = open("myfile2.txt", "w", encoding="utf8") fout.write("\u2022 hi there (utf8)") fout.close() # this case is still treated like codepage cp1252 # (User responsible for making sure that all utf8 files # have a BOM header) fout = open("badboy.txt", "wb") fout.write(b"hi there. barf(\x81\x8D\x90\x9D)") fout.close() # Read Example file with Bom Detection fin = OpenRead("myfile1.txt") L = fin.readline() print(L) fin.close() # Read Example file with Bom Detection fin = OpenRead("myfile2.txt") L =fin.readline() print(L) #requires QtConsole to view, Cmd.exe is cp1252 fin.close() # Read CP1252 with a few undefined chars without barfing fin = OpenRead("badboy.txt") L =fin.readline() print(L) fin.close() # Check that bad characters are still in badboy codepage file fin = open("badboy.txt", "rb") fin.read(20) fin.close()
определить кодировку текстового файла в общем случае в принципе невозможно. Так нет, нет стандартной библиотеки Python, чтобы сделать это для вас.
Если у вас есть более конкретные знания о текстовом файле (например, что это XML), могут быть функции библиотеки.