Python 3 не читает файл Unicode на новом сервере - PullRequest
4 голосов
/ 12 июня 2009

Мои веб-страницы обслуживаются скриптом, который динамически импортирует кучу файлов с

try:
    with open (filename, 'r') as f:
        exec(f.read())
except IOError: pass

(на самом деле, вы можете предложить лучший способ импорта файла? Я уверен, что есть один.)

Иногда файлы имеют строки на разных языках, например

# contents of language.ru
title = "Название"

Все они были сохранены в виде файлов UTF-8. У Python нет проблем с запуском скрипта в командной строке или с обслуживанием страницы из моего MacBook:

    OK: [server command line] python3.0 page.py /index.ru
    OK: http://whitebox.local/index.ru

но выдает ошибку при попытке отправить страницу с сервера, на который мы только что перешли:

      157     try:
      158         with open (filename, 'r') as f:
      159             exec(f.read())
      160     except IOError: pass
      161 
      /usr/local/lib/python3.0/io.py in read(self=, n=-1)
      ...
      UnicodeDecodeError: 'ascii' codec can't decode byte 0xe1 in position 627: ordinal not in range(128) 

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

Обновление: Я обнаружил, что кодировка по умолчанию для open() зависит от платформы, поэтому она была utf8 на моем ноутбуке и ascii на сервере. Интересно, есть ли функция для каждой программы для ее установки в Python 3 (sys.setdefaultencoding используется в модуле site, а затем удаляется из пространства имен).

Ответы [ 3 ]

15 голосов
/ 12 июня 2009

Используйте open(filename, 'r', encoding='utf8'). См. Документы Python 3 для открытых .

1 голос
/ 27 февраля 2015

Вы можете использовать что-то вроде

with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f:
    data = f.read()

# make changes to the string 'data'

with open(fname + '.new', 'w',
           encoding="ascii", errors="surrogateescape") as f:
    f.write(data)

дополнительная информация о документах Python Unicode

1 голос
/ 14 октября 2011

Используйте библиотеку кодеков, я использую Python 2.6.6 и не использую обычный аргумент open с кодировкой:

import codecs
codecs.open('filename','r',encoding='UTF-8')
...