在python中删除特定文件行之后的n行

时间:2014-08-22 17:18:10

标签: python file

我正在尝试从文件中删除特定数量的行。这些行总是出现在特定的注释行之后。无论如何,谈话很便宜,这是我所拥有的一个例子。

文件: -

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并且无法理解如何以这种方式做到这一点。答案建议您阅读文件,然后重新编写。这个问题是他们在写作时正在检查特定的行。我完全不能这样做,而且我不喜欢将整个文件内容存储在内存中的想法。这将占用大量文件的大量内存(因为每行必须存储,而不是一次存储)。

有什么想法吗?

3 个答案:

答案 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