1

我正在修复一个我想在 Github 上使用的损坏的库。

我已经在本地“修复”了这个问题。但我不认为这是一个非常干净的方法......

我正在通过互联网档案戳 WARC 库,特别是 arc.py 部分(https://github.com/internetarchive/warc/blob/master/warc/arc.py)。

由于编写了 lib,生成 ARC 文件的工具发生了一些变化,因此内置解析器失败,因为它不希望在文件中看到一些元数据。

我的本地修复如下所示:

    if header.startswith("<arcmetadata"):
        while not header.endswith("</arcmetadata>\n"):
            header = self.fileobj.readline()
        header = self.fileobj.readline()
        header = self.fileobj.readline()

而且我不确定我是否readlines()两次调用来删除接下来的两个空行(包含"/n"是推进文件对象的最干净的方式。

这是好蟒蛇吗?或者,还有更好的方法?

4

3 回答 3

2

该代码看起来像一个复制/粘贴错误。使用没有任何问题.readline(),只需记录您在做什么:

# skip metadata
if header.startswith("<arcmetadata"):
    while not header.endswith("</arcmetadata>\n"):
        header = self.fileobj.readline()
    #NOTE: header ends with `"</arc..."` here i.e., it is not blank

# skip blank lines
while not header.strip():
    header = self.fileobj.readline()

顺便说一句,如果文件包含 xml,则使用 xml 解析器来解析它。不要用手做。

于 2013-11-26T00:39:21.670 回答
1

尽管您所做的事情本质上没有任何问题,但编写起来可能更具语义:

next(self.fileobj, None)

没有变量赋值来表示你正在折腾下一行。

于 2013-11-25T22:36:54.207 回答
0

itertools可能在这里有用

from itertools import islice, dropwhile
if header.startswith("<arcmetadata"):
    fileobj = dropwhile(lambda x: not x.endswith("</arcmetadata>\n"), fileobj)
    fileobj = islice(fileobj, 2, None)
于 2013-11-26T00:19:02.433 回答