【发布时间】:2009-08-05 20:35:59
【问题描述】:
设置
我正在编写一个脚本来处理和注释来自 Visual Studio 的构建日志。构建日志是 HTML,据我所知,Unicode(UTF-16?)也是如此。这是其中一个文件的 sn-p:
c:\anonyfolder\anonyfile.c(17169):警告 C4701:使用了可能未初始化的局部变量“object_adrs2”
c:\anonyfolder\anonyfile.c(17409) : 警告 C4701: 使用了可能未初始化的局部变量 'pclcrd_ptr'
c:\anonyfolder\anonyfile.c(17440) : 警告 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 中的0xff 字节上阻塞。如果我跳过第一行,我将找不到匹配项:
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 文件?此外,我怎样才能重建原始文件? (目标是能够在警告行上写注释而不破坏文件。)
【问题讨论】:
-
您是否尝试按照以下建议添加对 decode() 的调用?
-
您使用的是 python 3.x 还是某些 2.x 变体?如果是前者,你会得到 unicode 格式的字符串。
-
我撤回我的回答。我尝试了 Alexander Ljungberg 的答案,效果很好。
-
您知道,
ffef是一个字节顺序标记 (BOM)。 en.wikipedia.org/wiki/Byte-order_mark