Python中的国际字符

时间:2012-12-20 12:55:19

标签: python encoding utf-8

我目前正在开发一个Python脚本,该脚本获取日志文件列表(来自搜索引擎)并生成一个包含这些日志文件的文件,供以后分析。 该脚本的另一个特点是它删除了我已经实现的最常见的单词,但我遇到了一个我似乎无法克服的问题。只要查询不包含特殊字符,删除单词就可以按预期工作。由于搜索日志是丹麦语,因此会定期出现æ,ø和å字符。

搜索主题我现在意识到我需要将这些编码为UTF-8,这是我在获取查询时所做的:

tmp = t_query.encode("UTF-8").lower().split()

t_query是查询,我将其拆分以便稍后将每个单词与我的禁词列表进行比较。如果我不使用编码,我将收到错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 1: ordinal not in range(128)

编辑:我也尝试使用解码,但收到以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa7' in position 3: ordinal not in range(128)

我循环这样的话:

for i in tmp:
    if i in words_to_filter:
        tmp.remove(i)

如上所述,这适用于不包括特殊字符的单词。我试图打印i以及当前的禁用词,并且会得到例如:

færdelsloven - færdelsloven

第一个单词是tmp中的第i个元素。禁忌词中的最后一个词。显然出现了问题,但我无法找到解决方案。我已经在谷歌和这里找到了许多建议,但到目前为止还没有任何工作。

编辑2:如果它有所不同,我尝试使用和不使用编解码器加载日志文件:

with codecs.open(file_name, "r", "utf-8") as f_src:
    jlogs = map(json.loads, f_src.readlines())

如果重要的话,我正在从Windows环境运行Python 2.7.2。该脚本应该能够在其他平台(即Linux和Mac OS)上运行。

如果你们中的一个能够帮助我,我将非常感激。

祝你好运 卡斯帕

4 个答案:

答案 0 :(得分:4)

如果您正在阅读文件,则需要decode他们。

tmp = t_query.decode("UTF-8").lower().split()

答案 1 :(得分:0)

给定一个每行有json对象的utf-8文件,你可以读取所有对象:

with open(filename) as file:
    jlogs = [json.loads(line) for line in file]

除了嵌入的换行符处理外,上述代码应该产生与您相同的结果:

with codecs.open(file_name, "r", "utf-8") as f_src:
    jlogs = map(json.loads, f_src.readlines())

此时 jlogs中的所有字符串都是Unicode,您无需执行任何操作来处理“特殊”字符。只需确保您没有在代码中混合使用字节和Unicode文本。

  • 从字节获取Unicode文本:some_bytes.decode(character_encoding)
  • 从Unicode文本中获取字节:some_text.encode(character_encoding)

不要编码字节/解码Unicode。

答案 2 :(得分:0)

如果编码正确并且您只想忽略意外字符,则可以使用传递给errors='ignore'函数的errors='replace'codecs.open参数。

with codecs.open(file_name, encoding='utf-8', mode='r', errors='ignore') as f:
    jlogs = map(json.loads, f.readlines())

文档中的详细信息: http://docs.python.org/2/howto/unicode.html#reading-and-writing-unicode-data

答案 3 :(得分:-1)

我终于解决了它。正如Lattyware Python 3.x似乎做得更好。更改版本并将Python文件编码为Unicode后,它按预期工作。