【问题标题】:Searching a Unicode file using Python使用 Python 搜索 Unicode 文件
【发布时间】: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

标签: python unicode encoding


【解决方案1】:

尝试使用编解码器包:

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

此外,您的打印语句可能会遇到问题,因为它可能会尝试将字符串转换为您的控制台编码。如果您正在打印您的评论,您可以使用,

print repr(line)

【讨论】:

  • 谢谢,这正是我所需要的。假设我遇到 UTF-8 或 ASCII 文件,这会中断吗?
  • @Andrew Keeton:如果您不将编码从“utf-16”更改为“utf-8”或“ascii”(或“cp1252”),当然会中断。见http://www.amk.ca/python/howto/unicodehttp://www.joelonsoftware.com/articles/Unicode.html
【解决方案2】:

试过了吗?在使用非 ascii 字符保存解析脚本时,我让解释器建议在文件前面使用替代编码。

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

添加它作为脚本的第一行解决了我的问题。不过,不确定这是否是导致您的错误的原因。

【讨论】:

  • 这当然不会导致他的错误。你的问题是编译时的问题——用 cp1252 编码的源文件没有这样声明。他是一个 RUN-time 问题,是由于尝试读取 utf16 编码的文件,就好像它是 ascii 一样。
猜你喜欢
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 2022-01-01
  • 2012-10-03
相关资源
最近更新 更多