Is this python file.seek() routine correct?
我觉得这套程序还行,但最后却把垃圾写进了文件。
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() |
您应该认为文件是不可更改的(除非您想附加到文件)。如果要更改文件中的现有行,请执行以下步骤:
在步骤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语句被定向到用原始名称创建的空文件中。完成后,将删除重命名的文件(也可以指定该文件应保留)。
您在文件上循环搜索了多次,但在再次读取之前永远不要重置位置。
在第一次迭代中,您读取第一行,然后在文件的其他位置查找,写入该位置,然后从
然后,
这可能不是你想做的。
如果您想从同一位置读取行,并将其写回同一位置,则需要首先查找并使用
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') |
但是请注意,如果写出的数据比原始行短或长,文件大小将不会调整!写较长的行将覆盖下一行的第一个字符,写较短的行将在文件中保留旧行的尾随字符。