这个例程看起来不错,但最终会把垃圾写到文件中。 lines_of_interest
是一组需要在文件中更改的行(896227L
,425200L
,640221L
等)。 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()
答案 0 :(得分:1)
您应该将文件视为不可更改(除非您要附加到文件)。如果要更改文件中的现有行,请执行以下步骤:
您不希望在步骤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')
但请注意,如果您写出的数据比原始行短或长,则文件大小将不调整!写一个较长的行将覆盖下一行的第一个字符,较短的写将在文件中留下旧行的尾随字符。