2016-11-24 128 views
7

我正在從包含法語和英語字母的單詞的文件中讀取數據。我試圖構建一個所有可能的英文和法文字母(存儲爲字符串)的列表。我爲此用下面的代碼:在Python中處理法語字母

# encoding: utf-8 
def trackLetter(letters, line): 
    for a in line: 
     found = False; 
     for b in letters: 
      if b==a: 
       found = True 
     if not found: 
      letters += a 

cur_letters = []; # for storing possible letters 

data = urllib2.urlopen('https://duolinguist.wordpress.com/2015/01/06/top-5000-words-in-french-wordlist/', 'utf-8') 
for line in data: 
    trackLetter(cur_letters, line) 
    # works if I print here 

print cur_letters 

此代碼打印如下:

[ 'T', 'H', 'E', '0', 'F',「一'','','','','','','','','','''',' ,'c','p','g','k','x','j','z','q','\ xc3', '\ xa0','\ xaa',' \'x9','\ xa8','\ xb4','\ xae',' - ','\ xe2',' \ xa7','\ xbb','\ xaf']

顯然F儘管我指定了UTF編碼,但在某種轉換爲ASCII的情況下,rench字母已丟失!奇怪的是,當我直接打印出該行(顯示爲註釋)時,法語字符顯示完美!

我應該怎麼做才能保留這些字符(é, è, ê, etc.)或將它們轉換回原始版本?

+1

可能重複[Unicode(utf8)讀取和寫入到python文件](http://stackoverflow.com/questions/491921/unicode-utf8-reading-and-writing-to-files-in-python) – mx0

+3

不,閱讀filie是不是問題 - 請參閱OP的「如果我在這裏打印的作品」評論 – Greg

回答

6

他們不會丟失,他們只是在您打印列表時逃脫。

當您在Python 2中打印列表時,它會調用列表本身的__str__方法,而不是每個單獨的項目,並且列表的__str__方法會轉義您的非ascii字符。見這個優秀的答案更多的解釋:

How does str(list) work?

下面的代碼演示問題succintly:

char_list = ['é', 'è', 'ê'] 
print(char_list) 
# ['\xc3\xa9', '\xc3\xa8', '\xc3\xaa'] 

print(', '.join(char_list)) 
# é, è, ê 
+0

這絕對有幫助,雖然它似乎無法解決我的問題。你的代碼完全適合我,但由於某種原因,當我在代碼末尾調用'print(''join(cur_letters))'時,它給了我錯誤'[Decode error - output not utf-8]' –

+0

如果我在法語字符 –

+0

上調用'print type(a)',那麼這個錯誤甚至會拋在我的'trackLetter()'函數中。如果你通過'codecs.open(「單詞打開文件,它是否解決了你的問題。 txt「,」r「,」utf-8「)? – Greg

0

不是一個理想的答案,但作爲一種解決方法,法國的字符也可以手動添加:

french_letters = ['é', 
     'à', 'è', 'ù', 
     'â', 'ê', 'î', 'ô', 'û', 
     'ç', 
     'ë', 'ï', 'ü'] 

all_letters = cur_letters + french_letters