Функция открытия ("x", "r") в Python, как узнать или контролировать, какая кодировка файла должна быть? - PullRequest
5 голосов
/ 01 мая 2011

Если скрипт Python использует функцию open("filename", "r") для открытия и последующего чтения содержимого текстового файла, как определить, какая кодировка этого файла должна быть?

Обратите внимание, что, поскольку яЯ выполняю этот сценарий из моей собственной программы, если есть какой-либо способ управлять этим через переменные окружения, то для меня этого вполне достаточно.

Кстати, это Python 2.7.

Данный код взят из Mercurial, ему можно дать список файлов, скажем, для добавления в хранилище, через файл на диске, вместо того, чтобы передавать их в командной строке.

Таким образом, вместо этогоиз этого:

hg add A B C

Я могу записать A, B и C в файл, с новой строкой между ними, а затем выполнить следующее:

hg add listfile:input.txt

Код, который заканчиваетсячтение этого файла таково:

files = open(name, 'r').read().split(delimiter)

Отсюда и мой вопрос.Когда я спросил, какую кодировку мне следует использовать, я получил ответ по IRC:

это та же кодировка, что и та, которую вы используете в командной строке при передаче аргумента файла

Я понимаю, что это та же самая кодировка, которую я "использую", когда выполняю Mercurial (hg).Поскольку я понятия не имею, какая это кодировка, я просто передаю все объекту .NET Process, я спрашиваю здесь.

1 Ответ

3 голосов
/ 01 мая 2011

Вы не можете.Чтение файла не зависит от его кодировки;вам нужно знать кодировку заранее, чтобы правильно интерпретировать прочитанные вами байты.

Например, если вы знаете, что файл закодирован в формате UTF-8:

with open('filename', 'rb') as f:
    contents = f.read().decode('utf-8-sig')    # -sig deals with BOM, if present

Или, если вы знаете, что файл является только ASCII:

with open('filename', 'r') as f:
    contents = f.read()    # results in a str object

Если вы действительно не знаете кодировку файла, то, очевидно, нет гарантии, что вы сможете правильно его прочитать;однако вы можете угадать кодировку, используя такой инструмент, как chardet.

ОБНОВЛЕНИЕ :

Мне кажется, я понимаю ваш вопрос сейчасЯ думал, что у вас есть файл, для которого нужно написать код, но, похоже, у вас есть код, для которого нужно написать файл; -)

Данный код, вероятно, правильно работает только с простым ASCII (возможно,Строки конвертируются позже, но вряд ли я думаю).Поэтому вы захотите создать текстовый файл, который содержит только символы ASCII (кодовая точка <128), и убедитесь, что он сохранен в кодировке ASCII (то есть не в UTF-16 или чем-то в этом роде).Это немного прискорбно, учитывая, что Mercurial работает с именами файлов, которые могут содержать символы Unicode. </p>

...