文件行为不一致

时间:2011-11-11 04:59:17

标签: python unicode file-encodings

我正在尝试在以下日志行中跟踪Python UnicodeDecodeError:

10.210.141.123 - - [09/Nov/2011:14:41:04 -0800] "gfR\x15¢\x09ì|Äbk\x0F[×ÐÖà\x11CEÐÌy\x5C¿DÌj\x08Ï ®At\x07å!;f>\x08éPW¤\x1C\x02ö*6+\x5C\x15{,ªIkCRA\x22 xþP9â\x13h\x01­¢è´\x1DzõWiË\x5C\x10sòʨR)¶²\x1F8äl¾¢{ÆNw\x08÷@ï" 400 166 0.000 "-" "-"

我在Vim中打开了整个日志文件,然后将该行拉到一个新文件中,这样我就可以测试一行了。但是,我的解析脚本可以正常使用新文件 - 它不会抛出UnicodeDecodeError。我不明白为什么一个文件会产生错误而另一个文件不会产生错误,当它们(表面上)相同时。

以下是我尝试的内容:运行enca来确定文件编码,抱怨它Cannot determine (or understand) your language preferences. file -i表示这两个文件都是Regular file。我还删除了原始日志文件中的所有其他行,但仍然在一个文件中出现错误而在另一个文件中没有错误。我试着删除

set encoding=utf-8 
从我的.vimrc

再次写入文件,我仍然在一个文件中得到错误,而在另一个文件中没有。

日志是nginx日志。 Nginx在他们的发行说明中有这个说明:

*) Change: now the 0x00-0x1F, '"' and '\' characters are escaped as \xXX
   in an access_log.
   Thanks to Maxim Dounin.

我的Python脚本有with open('log_file') as f,当我尝试在dict上调用json.dumps时出现错误。

我该如何追踪?

1 个答案:

答案 0 :(得分:1)

您的问题:如何跟踪此问题?

答案:

(1)向我们展示您收到的错误消息的全文 - 不知道您尝试使用的编码,我们无法告诉您任何事情。跟踪和一段代码读取文件并重现错误也很方便。

(2)编写一个小的Python脚本来查找文件中的行,然后执行:

print repr(the_line) # Python 2.X
print ascii(the_line) # Python 3.x

并将结果复制/粘贴到您的问题的编辑中,以便我们可以明确地看到该行中的内容。

(3)除了­之外,它看起来像是随机的乱码,但是告诉我们你是否希望该行是文本(如果是这样,用什么人类语言?)。