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

时间:2013-08-13 17:42:08

标签: python python-2.7 seek

这个例程看起来不错,但最终会把垃圾写到文件中。 lines_of_interest是一组需要在文件中更改的行(896227L425200L640221L等)。 if 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()

2 个答案:

答案 0 :(得分:1)

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

  1. 从输入文件中读取每一行,例如: data.txt中
  2. 将包括更改的行的每一行写入输出文件,例如new_file.txt
  3. 删除输入文件。
  4. 将输出文件重命名为输入文件名。
  5. 您不希望在步骤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模块打开您提供的文件名并重命名该文件。然后将print语句定向到使用原始名称创建的空文件。完成后,将删除重命名的文件(或者您可以指定它应保留)。

答案 1 :(得分:0)

您正在多次循环遍历文件搜索文件,但在重新阅读之前从不重置该位置。

在第一次迭代中,您读取第一个行,然后在其他地方搜索文件,写入该位置,然后break循环for change_this in out_file:

for lines in lines_of_interest:循环的下一次迭代然后再次从outfile 开始读取,但该文件现在位于最后outfile.write()离开的位置关闭。这意味着你现在正在阅读你刚刚写完的数据。

这可能你想做什么。

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

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')

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