2

我目前正在编写一个 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

4 回答 4

4

如果你正在阅读文件,你想要decode它们。

tmp = t_query.decode("UTF-8").lower().split()
于 2012-12-20T12:57:59.323 回答
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。

于 2012-12-21T10:15:39.077 回答
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

于 2012-12-21T13:55:32.567 回答
-1

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

于 2013-01-02T11:18:45.153 回答