我正在尝试从文件中删除特定数量的行。这些行总是出现在特定的注释行之后。无论如何,谈话很便宜,这是我所拥有的一个例子。
文件: -
randomstuff
randomstuff2
randomstuff3
# my comment
extrastuff
randomstuff2
extrastuff2
#some other comment
randomstuff4
所以,我想在# my comment
之后删除该部分。也许在某种程度上删除r+
模式中的一行?
这是我到目前为止所拥有的
with open(file_name, 'a+') as f:
for line in f:
if line == my_comment_text:
f.seek(len(my_comment_text)*-1, 1) # move cursor back to beginning of line
counter = 4
if counter > 0:
del(line) # is there a way to do this?
不完全确定如何做到这一点。如何删除特定行?我看过this possible dup并且无法理解如何以这种方式做到这一点。答案建议您阅读文件,然后重新编写。这个问题是他们在写作时正在检查特定的行。我完全不能这样做,而且我不喜欢将整个文件内容存储在内存中的想法。这将占用大量文件的大量内存(因为每行必须存储,而不是一次存储)。
有什么想法吗?
答案 0 :(得分:0)
您可以对代码进行少量修改,并将内容从一个文件流式传输到另一个文件。
with open(file_name, 'r') as f:
with open(second_file_name,'w') a t:
counter = 0
for line in f:
if line == my_comment_text:
counter = 3
elif: counter > 0
counter -= 1
else:
w.write(line)
答案 1 :(得分:0)
您可以使用fileinput
模块并以inplace=True
模式打开文件以允许就地修改:
import fileinput
counter = 0
for line in fileinput.input('inp.txt', inplace=True):
if not counter:
if line.startswith('# my comment'):
counter = 4
else:
print line,
else:
counter -= 1
修改符合comment"或者直到找到一个空行"
import fileinput
ignore = False
for line in fileinput.input('inp.txt', inplace=True):
if not ignore:
if line.startswith('# my comment'):
ignore = True
else:
print line,
if ignore and line.isspace():
ignore = False
答案 2 :(得分:0)
我喜欢答案形式@Ashwini。我也正在研究解决方案,如果你可以写一个带有过滤行的新文件,这样的东西应该可以工作:
def rewriteByRemovingSomeLines(inputFile, outputFile):
unDesiredLines = []
count = 0
skipping = False
fhIn = open(inputFile, 'r')
line = fhIn.readline()
while(line):
if line.startswith('#I'):
unDesiredLines.append(count)
skipping = True
while (skipping):
line = fhIn.readline()
count = count + 1
if (line == '\n' or line.startswith('#')):
skipping=False
else:
unDesiredLines.append(count)
count = count + 1
line = fhIn.readline()
fhIn.close()
fhIn = open(inputFile, 'r')
count = 0
#Write the desired lines to a new file
fhOut = open(outputFile, 'w')
for line in fhIn:
if not (count in unDesiredLines):
fhOut.write(line)
count = count + 1
fhIn.close()
fhOut.close