1

这个例程对我来说看起来不错,但最终将垃圾写入文件。lines_of_interest是一组需要在文件中更改的行( 896227L425200L、等)。640221Lif else 例程确定该行上的更改内容。这是我第一次使用seek()但相信语法是正确的。任何人都可以在代码中发现任何可以使其正常工作的错误吗?

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\n", addValue+"\n")
                outfile.write(line.encode('utf8', 'replace'))
                break#Only check 1 line
outfile.close()
4

2 回答 2

2

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

  1. 从输入文件中读取每一行,例如 data.txt
  2. 将包括更改的行在内的每一行写入输出文件,例如 new_file.txt
  3. 删除输入文件。
  4. 将输出文件重命名为输入文件名。

您不想在步骤 2) 中处理的一个问题是试图想出一个不存在的文件名。tempfile 模块将为您执行此操作。

fileinput 模块可用于透明地执行所有这些步骤:

#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

fileinput 模块打开你给它的文件名并重命名文件。然后将打印语句定向到使用原始名称创建的空文件中。完成后,重命名的文件将被删除(或者您可以指定它应该保留)。

于 2013-08-13T18:48:00.473 回答
1

你们都在循环文件在其中多次搜索,但在再次读取之前永远不会重置位置。

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

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

这可能不是您想要做的。

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

outfile = open(OversightFile, 'r+')

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\n", addValue+"\n")
        outfile.write(line.encode('utf8')

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

于 2013-08-13T17:49:32.677 回答