2012-03-31 70 views
4

關於Python 2.7,listdir同時不打印非英文字母正確

for dir in os.listdir("E:/Library/Documents/Old - Archives/Case"): 
    print dir 

打印出:

Danny.xlsx 
Dannyh.xlsx 
~$??? ?? ?????? ??? ???? ???????.docx 

,而這一點:

# using a unicode literal 
for dir in os.listdir(u"E:/Library/Documents/Old - Archives/Case"): 
    print dir 

打印出:

Dan.xlsx 
Dann.xlsx 

Traceback (most recent call last): 
    File "E:\...\FirstModule.py", line 31, in <module> 
    print dir 
    File "C:\Python27\lib\encodings\cp1252.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_table) 
UnicodeEncodeError: 'charmap' codec can't encode characters in position 2-4: character maps to <undefined> 

文件的名稱是希伯來文,因爲這樣的:המסמך.xls

我怎樣才能使它出現在希伯來文在Python呢?

+0

更奇怪:'S = os.listdir(U 「E:/庫/文件/舊 - 檔案/案例」)[2] 打印■'工作得很好。 – mirandalol 2012-03-31 10:42:55

+0

解決了它:'# - * - coding:utf-8 - * - ' 在文檔頂部解決了它。 – mirandalol 2012-03-31 10:45:15

+2

當你解決自己的問題時,你應該回答問題而不是評論,並接受它。 – agf 2012-03-31 11:02:10

回答

1

解決了它:# -*- coding: utf-8 -*-在文檔頂部解決了它。

+0

這不能解決所述的問題。其他的東西必須同時改變。該註釋僅聲明源編碼,並且僅影響Python 2上的非ASCII的源文件。該示例僅爲ASCII,因此該效果爲零。 OP更可能同時在'listdir'中更改爲Unicode字符串。 – 2017-09-03 15:28:00

6

版本號u''字符串文字工作正常:請求一個Unicode路徑名,您將得到一個Unicode路徑名作爲迴應,允許您使用包含當前代碼頁之外的字符的文件名。

你的問題完全來自嘗試print的文件名。獲取Unicode輸出到Windows命令提示符是一個試用版。

默認C標準庫打印功能僅限於區域代碼頁。除非直接調用Win32 API函數WriteConsoleW(使用ctypes),否則永遠不會獲得可靠的控制檯Unicode支持;即使如此,除非選擇了合適的非默認字體,否則它將不起作用。這幾乎影響所有非本地命令行工具,而不僅僅是Python。

+0

這就是我一直在尋找的!我讀了文件夾名稱,我不知道python給我的編碼。在我能夠從中獲得Unicode代碼點值之前,我必須猜測使用多個編解碼器名稱進行解碼。這真的解決了這些問題。 – off99555 2016-06-08 20:21:48

+0

事實上,python並沒有爲我推斷任何編碼。它只是給了我在字節十六進制值的形式,讓我找到這些文件名自己的編碼。 – off99555 2016-06-08 20:32:46

1

問題是您的輸出控制檯使用每個錯誤消息的cp1252編碼,並且在該編碼下不能打印希伯來語。使用支持UTF-8的IDE,並在該IDE中支持希伯來語的字體,並且在使用帶有Unicode路徑的os.listdir時它將正確運行。

下面是帶有和不帶Unicode路徑的PythonWin IDE的示例。

PythonWin 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32. 
Portions Copyright 1994-2008 Mark Hammond - see 'Help/About PythonWin' for further copyright information. 
>>> import os 
>>> for f in os.listdir('.'): 
...  print f 
...  
x.exe 
x.py 
x.pyc 
y.py 
?????.xls 
>>> for f in os.listdir(u'.'): 
...  print f 
...  
x.exe 
x.py 
x.pyc 
y.py 
המסמך.xls 

還要注意,在源文件編碼聲明不什麼生成輸出。它只有聲明保存了源文件的編碼,這會影響在源文件中編寫非ASCII字符的能力。