这个python file.seek()例程是否正确?

Is this python file.seek() routine correct?

我觉得这套程序还行,但最后却把垃圾写进了文件。lines_of_interest是需要在文件中更改的一组行(896227L425200L640221L等)。if-else例程确定该行上更改的内容。这是我第一次使用seek(),但相信语法是正确的。有人能在代码中发现任何能使其正常工作的错误吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
outfile = open(OversightFile, 'r+')
for lines in lines_of_interest:
        for change_this in outfile:
            line = change_this.decode('utf8', 'replace')
            outfile.seek(lines)
            if replacevalue in line:
                line = line.replace(replacevalue, addValue)
                outfile.write(line.encode('utf8', 'replace'))
                break#Only check 1 line
            elif not addValue in line:
                #line.extend(('_w\t1\t'))
                line = line.replace("\t
"
, addValue+"
"
)
                outfile.write(line.encode('utf8', 'replace'))
                break#Only check 1 line
outfile.close()


您应该认为文件是不可更改的(除非您想附加到文件)。如果要更改文件中的现有行,请执行以下步骤:

  • 从输入文件中读取每一行,例如data.txt
  • 将包括更改行在内的每一行写入输出文件,例如new_file.txt
  • 删除输入文件。
  • 将输出文件重命名为输入文件名。
  • 在步骤2)中,您不想处理的一个问题是,试图变出一个不存在的文件名。tempfile模块将为您实现这一点。

    文件输入模块可用于透明地执行所有这些步骤:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #1.py
    import fileinput as fi

    f = fi.FileInput('data.txt', inplace=True)

    for line in f:
        print"***" + line.rstrip()

    f.close()

    --output:--
    $ cat data.txt
    abc
    def
    ghi
    $ python 1.py
    $ cat data.txt
    ***abc
    ***def
    ***ghi

    文件输入模块打开您提供的文件名并重命名文件。然后,print语句被定向到用原始名称创建的空文件中。完成后,将删除重命名的文件(也可以指定该文件应保留)。


    您在文件上循环搜索了多次,但在再次读取之前永远不要重置位置。

    在第一次迭代中,您读取第一行,然后在文件的其他位置查找,写入该位置,然后从for change_this in out_file:循环中删除break

    然后,for lines in lines_of_interest:循环的下一个迭代再次开始从outfile读取,但文件现在位于最后一个outfile.write()停止的位置。这意味着您现在正在读取刚刚写入的数据后面的内容。

    这可能不是你想做的。

    如果您想从同一位置读取行,并将其写回同一位置,则需要首先查找并使用.readline()而不是迭代来读取行。然后在写作前再次寻找:

    outfile=打开(oversightfile,'r+')

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for position in lines_of_interest:
        outfile.seek(position)
        line = outfile.readline().decode('utf8', 'replace')
        outfile.seek(position)
        if replacevalue in line:
            line = line.replace(replacevalue, addValue)
            outfile.write(line.encode('utf8'))
        elif not addValue in line:
            line = line.replace("\t
    "
    , addValue+"
    "
    )
            outfile.write(line.encode('utf8')

    但是请注意,如果写出的数据比原始行短或长,文件大小将不会调整!写较长的行将覆盖下一行的第一个字符,写较短的行将在文件中保留旧行的尾随字符。