2016-01-31 2 views
4

Я хочу загрузить все фотографии с веб-сайта с помощью Python. У меня уже есть заголовок HTML-файла, поэтому я использую os.mkdir() для создания папки, но название содержит китайский. Когда выполняется следующий код на Raspberry Pi (OS: Debian), есть исключение:Raspberry Pi с использованием Python для mkdir

UnicodeEncodeError: 'ascii' codec can't encode characters in position 20-38: ordinal not in range(128)

try: 
    os.mkdir(path) 
except: 
    print "create folder failed" 
    continue 

Все нормально, если я запускаю код на моем Mac.

Я искал проблему и пробовал код ниже, но он не работает.

reload(sys) 
sys.setdefaultencoding('utf-8') 

Update:

Я изменил мой код много, и читать статьи о юникода, UTF-8 .etc. Но каждый раз, когда я запускаю код на малине Pi, он раздавлен. Затем я установил ОС Debian (это то, что я установил на моем малине Pi) на ПК, запустил код на нем, все в порядке.

Таким образом, проблема на самом деле не вызвана кодом, а SSH.

Если я запускаю код непосредственно на компьютере Debian на рабочем столе, все в порядке. Если я войду в оболочку с моего Mac с помощью SSH и запустим код, появится исключение, которое говорит «Unicode ...» что-то вроде этого.

Я думаю, что это вызвано переменными окружения, я попытаюсь выяснить это завтра, и спасибо, ребята :-)

+1

'setdefaultencoding' работает скорее с' print' или 'write' - try' os.mkdir (path.encode ('utf-8')) ' – furas

+0

Ничего себе, это работает, спасибо. Но это так раздражает, чтобы изменить код. Есть ли способ заставить его работать, как на моем Mac? –

+0

попробуйте 'print sys.getfilesystemencoding()', чтобы узнать, что вы получаете. Возможно, если вы установите переменную среды LANG в Debian, вам не нужно будет использовать 'encode()'. Проверьте также bash 'echo $ LANG'. – furas

ответ

-1

Возможно вы работаете с Python 2, попробуйте добавить следующий код в самом верху вы сценарий и посмотреть, если он будет работать:

from __future__ import unicode_literals 

и не забудьте удалить ваши 2 строки с sys.

Это позволит использовать строки unicode везде в вашем скрипте по умолчанию, поэтому любая строка, полученная как результат или явно определенная (даже без u), как s="string", будет строкой unicode и поэтому будет поддерживать китайские символы.

+0

Заботьтесь, чтобы объяснить, когда downvoting, почему я ошибаюсь, и мое предложение не вариант? – Nikita

0

Вы можете добавить r или u префикс перед своим именем каталога, как

>>> import os 
>>> os.mkdir(r'文件夹') 
>>> os.mkdir(u'文件夹') 

, и он будет создавать 'ххх/文件 夹 /' для меня.

Надеюсь, что это поможет.

0

setdefaultencoding работы, а с print или write - попробуйте os.mkdir(path.encode('utf-8'))

-

КСТАТИ: попробуйте print sys.getfilesystemencoding() - если вы что-то другое, чем utf8, чем, может быть, вы должны установить переменную окружения LANG в Bash. Проверьте в Bash echo $LANG. Если вы получите что-то без utf8, попробуйте export LANG=en_GB.utf8 в Bash, прежде чем запускать скрипт python без encode().Если он будет работать, вы можете поместить export LANG=en_GB.utf8 в ~/.bashrc или ~/.profile или вероятно /etc/profile

Найдите больше о locale и locales в raspberry

0

Наконец, я знаю, что это неправильно :-)

Единственное, должно быть сделано только для того, чтобы установить переменную среды LC_CTYPE в "***.UTF-8"

Я установил Debian на английском языке на ПК, Debian на китайском языке на другом ПК. У меня есть vps (Ubuntu на английском языке), и у меня есть Mac (Mac OS X на английском языке). Это то, что я получил enter image description here

Как вы можете видеть, когда LC_CTPPE является "***.UTF-8", я могу ввести китайский и оболочка может показать китайский. Но когда это что-то еще, моя программа будет раздавлена.

Резюме:

  1. Если код может работать в нормальном режиме на вашем компьютере, но не на другом компьютере, это может быть вызвано переменной (ы) окружающей среды.

  2. Если номер LC_CTYPE похож на "*.UTF-8", все в порядке. Будьте осторожны, не *.UTF-8, это "*.UTF-8", обратите внимание на цитаты. Не знаю, является ли это ошибкой, но только UTF-8 без кавычек не будет работать.

  3. Некоторые приложения, такие как iTerm, будут устанавливать переменные окружения для вас при входе на другой компьютер, иногда это вызовет проблемы.

Спасибо всем тем же.

Обновление: Вот мое мнение, может быть, это неправильно.

Если номер LC_CTYPE не содержит кавычек, ОС не будет его понимать, поэтому ОС использует ASCII. Когда на китайском языке есть слово, python попытается декодировать его в unicode, и проблем нет. Но когда есть print, python попытается закодировать слово до LC_CTYPE, чтобы распечатать его на экране. Если юникод слова больше 127, DUANG! DUANG! DUANG, есть исключение.