Функция Python open («x», «r»), откуда я могу узнать, какой кодировке должен иметь файл?

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

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

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

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

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

 hg add ABC 

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

 hg add listfile:input.txt 

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

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

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

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

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

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

Например, если вы знаете, что файл закодирован в 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 (codepoint <128) и убедитесь, что он сохранен в кодировке ASCII (то есть не UTF-16 или что-то в этом роде). Это немного печально, учитывая, что Mercurial имеет дело с именами файлов, которые могут содержать символы Unicode.