我正在从一个包含有法语和英语字母的单词的文件中读取数据。我正试图构建一个所有可能的英语和法语字母的列表(存储为字符串)。我使用下面的代码进行此操作:

# 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'、'o'、'f'、'a'、'n'、'd'、'i'、'r'、's'、'b'、'y'、'w',
'U'、'M'、'L'、'V'、'C'、'P'、'G'、'K'、'X'、'J'、'Z'、'Q'、'XC3',
'\xa0'、'\xaa'、'\xb9'、'\xa9'、'\xa8'、'\xb4'、'\xae'、'-'、'\xe2',
'\x80'、'\x99'、'\xa2'、'\xa7'、'\xbb'、'\xaf']
显然,尽管我指定了UTF编码,但在某种形式的转换中,法语字母已经丢失了!奇怪的是,当我直接打印出这行(显示为注释)时,法语字符看起来非常完美!
我应该如何保存这些字符(é, è, ê, etc.),或者将它们转换回原始版本?

最佳答案

它们不会丢失,它们只是在打印列表时逃走的。
当您在python 2中打印一个列表时,它调用列表本身的__str__方法,而不是在每个单独的项目上,并且列表的__str__方法会避开您的非ASCII字符。更多解释请参见这个很好的答案:
How does str(list) work?
下面的代码片段简洁地演示了这个问题:

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

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

08-06 21:01