我目前正在开发一个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)上运行。
如果你们中的一个能够帮助我,我将非常感激。
祝你好运 卡斯帕
答案 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文本。
some_bytes.decode(character_encoding)
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后,它按预期工作。