2016-01-31 63 views
4

我想使用Python下载网站上的所有图片。我已经有了HTML文件的标题,因此我使用os.mkdir()来创建文件夹,但标题包含中文。当树莓派(OS:Debian的)执行下面的代码,有一个例外:使用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上的代码。

我GOOGLE了这个问题,并尝试下面的代码,但它不工作。

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

更新:

我已经改变了我的代码了很多,阅读有关Unicode,UTF-8 .etc一些文章。但是,每次我在Raspberry Pi上运行代码时,都会崩溃。然后,我在PC上安装了Debian OS(这是我在Raspberry Pi上安装的),运行代码,一切正常。

所以这个问题实际上不是由代码引起的,而是由SSH造成的。

如果我在桌面环境中直接在Debian PC上运行代码,那没关系。如果我使用SSH从我的Mac登录到shell,然后运行代码,会出现一个异常“Unicode ....”。

我认为它是由环境变量引起的,我会揣摩明天,谢谢你们:-)

+1

'setdefaultencoding'与'print'或'write'相当 - 尝试'os.mkdir(path.encode('utf-8'))' – furas

+0

哇,它的工作,谢谢。但是改变代码太麻烦了。有没有办法让它像我的Mac一样工作? –

+0

尝试'print sys.getfilesystemencoding()'看看你得到了什么。也许如果你在Debian中设置环境变量'LANG',那么你将不需要使用'encode()'。同样检查bash'echo $ LANG'。 – furas

回答

-1

也许你正在使用Python 2个工作,尝试的最顶部加入如下代码你的脚本,看看它是否会工作:

from __future__ import unicode_literals 

,不要忘记与sys删除您2行。

默认情况下,这将在脚本中的任何地方启用unicode字符串,因此任何字符串作为结果获得或明确定义(即使没有u),如s="string"将为unicode字符串,因此将支持中文字符。

+0

小心解释什么时候downvoting,为什么我错了,我的建议不是一个选项? – Nikita

0

您可以将目录名称前添加ru前缀,像

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

,将创建 'XXX /文件夹/' 我。

希望它有帮助。

0

setdefaultencoding作品,而与printwrite - 尝试os.mkdir(path.encode('utf-8'))

-

BTW:尽量print sys.getfilesystemencoding() - 如果你得到的东西比utf8比也许你应该在猛砸设置环境变量LANG不同。入住Bash echo $LANG。如果你在Bash中没有utf8尝试export LANG=en_GB.utf8而没有使用encode()运行python脚本。如果它的工作,你可以把export LANG=en_GB.utf8~/.bashrc~/.profile或可能/etc/profile

搜索更多关于localelocalesraspberry

0

最后,我知道什么是错:-)

唯一应该是完成只是将LC_CTYPE环境变量设置为"***.UTF-8"

我在一台PC上用英文安装了Debian,在另一台PC上用中文安装了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_CTYPEUTF-8没有引号,操作系统将无法理解它,所以操作系统使用ASCII。当中文有一个单词时,python会尝试将它解码为unicode,并且没有问题。但是,当有一个print时,python会尝试将该字编码为LC_CTYPE以将其打印到屏幕上。如果这个单词的unicode大于127,那么DUANG!DUANG!DUANG就有一个例外。