2013-10-29 81 views
3

Python版本檢測文件名測試雪人字符--☃ - MP3在Windows Unicode字符

運行下面的測試中,他們沒有一個是成功的。

>>> os.path.exist('test snowman character --☃--.mp3') 
False 
>>> os.path.exist(repr('test snowman character --☃--.mp3')) 
False 
>>> os.path.isfile('test snowman character --\\xe2\\x98\\x83--.mp3') 
False 
>>> os.path.isfile(r'test snowman character --\\xe2\\x98\\x83--.mp3') 
False 
>>> os.path.isfile('test snowman character --☃--.mp3'.decode('utf-8')) 
False 

試圖檢索帶有glob的文件,即使該測試失敗。

目標是檢測並將該文件複製到另一個文件夾, 請指教。

+1

什麼'os.listdir(u'。')'告訴你在當前目錄中? –

+0

注意:轉義UTF8字節序列在這裏不起作用;但是由於Windows NTFS文件系統使用UTF16,所以也不會使用UTF8。在這裏給python * unicode *路徑值;只有當unicode雪人真正以UTF8格式輸入終端時,您的最新版本才能正常工作。 –

回答

0

文字Unicode字符串應該與u'開始,嘗試os.path.exist(u'test snowman character --☃--.mp3')

如果你想使用它的ur'轉義序列,如os.path.isfile(ur'test snowman character --\\xe2\\x98\\x83--.mp3')

http://docs.python.org/2.7/reference/lexical_analysis.html#strings

+1

'.decode('utf8')'可能已經處理了這種情況。 –

+0

原始unicode字符串保留反斜槓。 UTF8的'字節'是字面上的,而不是一個碼點。改爲在unicode字符串中使用'\ u2603'。 –

+0

.decode()取決於源文檔的默認編碼是否正確。它通常是ASCII碼,但是你的字符串不是ASCII碼(至少是無效的ASCII碼)。請參閱:https://wiki.python.org/moin/DefaultEncoding和http://docs.python.org/2/howto/unicode.html – SpliFF

2

在Windows NTFS文件系統使用UTF-16 (只是問Martijn Pieters),所以試試這個:

>>> os.path.exists(u'test snowman character --☃--.mp3'.encode("UTF-16")) 

但首先確保解釋器的輸入編碼是正確的。 print repr(u'test snowman character --☃--.mp3')應該輸出:

u'test snowman character --\u2603--.mp3' 

注:我不能對此進行測試與Windows CMD不會讓我輸入雪人符號。無論如何,事實證明,如果你只是給它一個Unicode字符串,Python會做正確的事情,所以編碼調用是多餘的。總而言之,我推薦Martijn Pieters'答案。

+0

輸出將在'u'前面使用一個**單**反斜槓。 –

+0

@MartijnPieters:我直接從解釋器中複製。由於輸出表示是「字符串內的字符串」,因此需要將反斜線轉義。 – Hubro

+0

正確;你在解釋器中只用*'repr()'。解釋器再次使用**上的'repr()'。你通常會在解釋器中隱藏一個顯式的'repr()',或者使用'print repr()';重點是獲得一個可循環表示,這看起來像一個可以再次使用的unicode文字。這裏額外的反斜槓使得它的值不可重複使用,這個問題與關於何時逃生逃脫的另一個答案之間存在足夠的混淆。 –

3

使用unicode值;最好使用Unicode轉義序列:

os.path.isfile(u'test snowman character --\u2603--.mp3') 

,當你給它一個unicode路徑Windows上的Python將使用上市UTF-16文件正確的Windows API。

有關Python如何通過unicode與bytestring文件路徑改變行爲的更多信息,請參閱Python Unicode HOWTO

+0

+1剛剛測試過,它的工作原理。 – Hubro