python用seek替换fileinput

时间:2013-06-12 11:04:57

标签: python file

我有一个以</END>结尾的文件,文件可能在</END>之后包含空行。我不在乎空白行。但最后一个非空白字是</END>。我需要在</END>之前添加几行。我用fileinput

完成了这项工作
for each_line in fileinput.input("testme",inplace=True):
    if each_line.strip() == '</END>':
        print "\nAdding ^.*"+source_resource+".*$ \\"
        print destination+" [R="+http_code+",L]"
    print each_line,

有些专家可以建议如何通过seek实现这一目标。我相信seek对于光标定位非常方便。

2 个答案:

答案 0 :(得分:1)

您有两种可能的方法,一种使用就地写入,另一种则意味着创建文件的副本。

第二种方法很容易实现:

with open(src_path, "r") as in_f, open(dest_path, "w") as out_f:
    for line in in_f:
        if line == "</END>":
            out_f.write("whatever you want")
        out_f.write(line)
        out_f.write('\n')

对于第一种方法,我们需要检测结束线并返回其开头:

last = 0
with open(src_path, "r+") as f:
    for line in f:
        if line == "</END>":
            f.seek(last)
            f.write("whatever you want"
            f.write(line) # rewrite the line
            f.write('\n')
        last = f.tell() # This will give us the end of the last line

我确实按头编写了这段代码,所以可能会有一些错误,但你明白了。

答案 1 :(得分:0)

我不会用seek来做,因为你必须自己指定所有的偏移量 - 它会强制你明确地分割线等(取决于操作系统......) - 所有这些往往容易出错。

如果你的语法规定每个-tag在一个单独的行中,你可以使用你拥有的代码(它很简单,可以理解,并且可能很快)。

如果您需要一个不太严格的语法,那么我将使用pyparsing构建一个简单的解析器(假设性能不是主要关注点)。