使用Python搜索Unicode文件

1 投票
2 回答
1783 浏览
提问于 2025-04-15 13:24

设置

我正在写一个脚本,用来处理和标注来自Visual Studio的构建日志。这些构建日志是HTML格式的,而且我猜它们可能是Unicode编码(可能是UTF-16)。下面是其中一个文件的片段:

c:\anonyfolder\anonyfile.c(17169) : warning C4701: 可能未初始化的局部变量 'object_adrs2' 被使用
c:\anonyfolder\anonyfile.c(17409) : warning C4701: 可能未初始化的局部变量 'pclcrd_ptr' 被使用
c:\anonyfolder\anonyfile.c(17440) : warning C4701: 可能未初始化的局部变量 'object_adrs2' 被使用

文件的前16个字节看起来是这样的:

feff 003c 0068 0074 006d 006c 003e 000d

文件的其余部分也充满了空字节。

我想在这些文件上进行字符串和正则表达式的搜索/匹配。但是,当我尝试以下代码时,出现了错误信息。

buildLog = open(sys.argv[1]).readlines()

for line in buildLog:
    match = u'warning'
    if line.find(match) >= 0:
        print line

错误信息是:

追踪(最近的调用在最前面):
文件 "proclogs.py",第60行,
如果 line.find(match) >= 0:
UnicodeDecodeError: 'ascii' 编解码器无法解码位置0的字节0xff: 序号不在范围内(128)

显然,它在文件开头的0xfeff字节上出现了问题。如果我跳过第一行,就没有匹配结果:

buildLog = open(sys.argv[1]).readlines()

for line in buildLog[1:]: # Skip the first line.
    match = u'warning'
    if line.find(match) >= 0:
        print line

同样,使用非Unicode的match = 'warning'也没有结果。

问题

我该如何在Python中便捷地使用字符串和正则表达式搜索Unicode文件?另外,我该如何做到这一点,以便能够重建原始文件?(目标是能够在警告行上写注释,而不破坏文件。)

2 个回答

0

你试过这个吗?在保存一个包含非ASCII字符的解析脚本时,我的解释器建议在文件开头使用另一种编码方式。

Non-ASCII found, yet no encoding declared.  Add a line like:
# -*- coding: cp1252 -*-

把这个作为脚本的第一行加上后,问题就解决了。不过我不确定这是否就是你出错的原因。

7

试试使用codecs这个包:

import codecs
buildLog = codecs.open(sys.argv[1], "r", "utf-16").readlines()

另外,你在使用print语句的时候可能会遇到问题,因为它可能会尝试把字符串转换成你控制台的编码。如果你只是为了查看输出,可以使用:

print repr(line)

撰写回答