Читать строки из файла и впоследствии записывать в файл только те строки, которые не содержат определенной фразы - PullRequest
0 голосов
/ 01 января 2019

У меня есть один файл списка столбцов:

$ cat test
blah
blahblah
blah22
bluh
blih
blihihih

Все, что я хочу, это удалить blah -подобные строки.(Эквивалент bash grep -v blah.) Так что blah, blahblah и blah22 удалены.

Пока у меня есть это:

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

Почему это удалило blih или bluh?

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Как получилось, это удалило blih или 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(). Узнайте больше о том, почему, например, with здесь .)

0 голосов
/ 01 января 2019

Я думаю, что лучше, если вы сначала откроете файл, а затем напишите в него:

# 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
...