2016-01-31 184 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就有一個例外。