10

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

# 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 编码,但在某种转换为 ASCII 的过程中,法语字母已经丢失了!奇怪的是,当我直接打印出该行(显示为注释)时,法语字符完美显示!

我应该怎么做才能保留这些字符 ( é, è, ê, etc.),或者将它们转换回原来的版本?

4

2 回答 2

7

它们并没有丢失,它们只是在您打印列表时被转义。

当您在 Python 2 中打印列表时,它会调用__str__列表本身的方法,而不是在每个单独的项目上,并且列表的__str__方法会转义您的非 ascii 字符。有关更多解释,请参阅此出色答案:

str(list) 是如何工作的?

下面的代码片段简洁地演示了这个问题:

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

print(', '.join(char_list))
# é, è, ê
于 2016-11-24T20:33:45.110 回答
-1

不是一个理想的答案,但作为一种解决方法,也可以手动添加法语字符:

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

all_letters = cur_letters + french_letters
于 2016-11-24T21:49:55.147 回答