从文件中读取行,然后只将那些不包含特定短语的行写入文件

2024-09-30 01:29:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列列表文件:

$ cat test
blah
blahblah
blah22
bluh
blih
blihihih

我只想删除blah样的行。(相当于bashgrep -v blah)这样blahblahblahblah22就被删除了。你知道吗

到目前为止我有:

>>> f = open('test', 'rw+')
>>> line = f.readlines()
>>> for l in line:
...     if l.find('blah') == -1:
...             f.truncate(0)
...             f.write(l)
... 
>>> f.close()  

我认为这会很好,但在运行这个之后,从测试文件中只剩下这一行:

$cat test
blihihih  

为什么,这已经删除了blihbluh?你知道吗


Tags: 文件test列表lineopencatblahrw
2条回答

How come, this has removed blih or bluh?

为了回答您的问题,您太频繁地截断文件。每次调用f.truncate(0)都会将文件大小重置为0。因此,只有最后一行blihihih将继续存在。你知道吗

如果您想一次性完成:

f = open('test.txt', 'r+')
lines = f.readlines()
f.seek(0)
for line in lines:
    if line.find('blah') < 0:
        f.write(line)
f.truncate()
f.close()

另外,您应该真正使用with

with open('test.txt', 'r+') as f:
    lines = f.readlines()
    f.seek(0)
    for line in lines:
        if line.find('blah') < 0:
            f.write(line)
    f.truncate()

(这样就不需要写f.close()。阅读更多关于为什么使用withhere的信息。)

我认为最好先打开文件,然后写入:

# open file
lines = open('test').readlines()

# over-write the file
with open('test', 'w') as out:
    for line in lines:
        if 'blah' not in line:
            out.write(line)

输出(测试中)

bluh
blih
blihihih

相关问题 更多 >

    热门问题