我正在尝试从文本文件中删除空行,所以如果我有例如:
line 1
line 2
line 3
line 4
line 5
处理文件后的结果应如下所示:
line 1
line 2
line 3
line 4
line 5
我搜索了堆栈溢出,这是我到目前为止所发布的:
with open('file.txt', 'r+', encoding='utf-8') as file:
for line in file:
if line.strip():
file.write(line)
除了一点点不方便之外,它完美地工作了;而不是用新的内容替换原始内容,结果将附加到文件的末尾,如下所示:
line 1
line 2
line 3
line 4
line 5line 1
line 2
line 3
line 4
line 5
我的问题是,有没有办法在没有外部存储的情况下在for循环中解决这个问题(将结果存储在文件或列表中并将其写回文件)?或者如果有更好的方式请分享。
我希望我的问题很明确,谢谢。
答案 0 :(得分:2)
这是一个可以满足您需求的工作示例。 我不确定这里的性能,但肯定它不使用内存或临时文件
writebytecount = 0
readbytecount = 0
with open('file2.txt', 'r+') as file:
while 1:
line = file.readline()
if not line: break
readbytecount = file.tell()
file.seek(writebytecount)
file.write(line)
if len(line.strip()) != 0:
writebytecount += len(line)+1
file.seek(readbytecount)
file.seek(writebytecount)
file.truncate(writebytecount)
file.close()
答案 1 :(得分:1)
首先,输出被附加到文件中,因为您以r+
模式打开文件,文件指针指向文件的末尾。但是,在您阅读文件时,您不会想要覆盖该文件,因此您确实需要两个文件:
with open('infile.txt', 'r', encoding='utf-8') as inFile,\
open('outfile.txt', 'w', encoding='utf-8') as outFile:
for line in inFile:
if line.strip():
outFile.write(line)