2013-01-06 76 views
4

我在Mac OS X 10.8.2Python的水珠模塊和UNIX」 find命令不承認非ASCII

當我試圖找到包含非ASCII字符我沒有得到任何結果文件名的文件儘管我確信他們已經存在。以控制檯輸入爲例

> find */Bärlauch* 

我沒有得到任何結果。但是,如果我嘗試沒有元音變音我得到

> find */B*rlauch* 
images/Bärlauch1.JPG 

所以該文件是肯定存在的。如果我用'ae'重命名文件替換'ä',文件被找到。

相若方式的Python模塊glob無法找到文件:

>>> glob.glob('*/B*rlauch*') 
['images/Bärlauch1.JPG'] 
>>> glob.glob('*/Bärlauch*') 
[] 

我想通了,它必須是與編碼,但我的終端設置爲UTF-8和我使用使用unicode字符串的Python 3.3.0。

+0

Mac默認使用分解的unicode字符。嘗試匹配''*/Ba \ xcc \ x88rlauch *''。 –

+0

@MartijnPieters我只是用'find'和'glob'嘗試了你的建議。沒有結果...但是,謝謝你的幫助 – LifeIsHealthy

+0

在這個目錄下的'[repr(e)for os.listdir()]'會給你帶來什麼?確切的蟒蛇表示請。 –

回答

6

的Mac OS X使用非正規化文字總是對HFS +文件名。使用unicodedata.normalize('NFD', pattern)可以使glob模式非規範化。

import unicodedata 

glob.glob(unicodedata.normalize('NFD', '*/Bärlauch*')) 
+0

不錯!這完美的作品! – LifeIsHealthy

+1

@Martijn我不知道你,但我想這樣的事情或許應該去Python的bug跟蹤系統... –

+0

另見http://apple.stackexchange.com/questions/10476/how-to-輸入特殊字符那麼bash終端理解他們爲你的同樣的問題。這不是一個Python錯誤。 – mmgp

1

Python程序基本上是文本文件。通常,人們只使用ASCII字符集中的字符來編寫它們,因此不必考慮他們編寫的編碼:所有字符集都應該如何解碼ASCII字符。

您已經編寫了一個使用非ASCII字符的Python程序。因此你的程序帶有一個隱含的編碼(你沒有提到):爲了保存這樣的文件,你必須決定如何在磁盤上表示變音符號。我猜可能你的編輯爲你選擇了一些非Unicode的東西。

無論如何,圍繞這樣一個問題有兩種方法:要麼你可以限制自己在程序的源代碼中只使用ASCII字符,要麼你可以向Python聲明你想用它讀取文本文件具體編碼。

要做到這一點,你應該用它的Unicode轉義序列(我認爲是\x0228,但目前無法測試)替換變音符號。對於後者,應在該文件的頂部添加編碼聲明:

# -*- coding: <your encoding> -*- 
+0

設置UTF8的源編碼與Python 3無關,因爲已經假定。 – mmgp

+0

@mmgp啊,我沒有意識到。謝謝。 – katrielalex

+0

供進一步閱讀:[PEP 8](http://www.python.org/dev/peps/pep-0008/#encodings-pep-263)和[PEP 263](http://www.python.org/dev/peps/pep-0263 /) – moooeeeep