Удаление определенной строки из текстового файла в Python [дубликат]

91
задан SourD 17 January 2011 в 05:38
поделиться

13 ответов

Предполагая, что ваш файл находится в формате одного псевдонима для каждой строки, используйте это.

Сначала откройте файл:

f = open("yourfile.txt","r")

Далее, получите все свои строки из file:

lines = f.readlines()

Теперь вы можете закрыть файл:

f.close()

И снова открыть его в режиме записи:

f = open("yourfile.txt","w")

Затем напишите назад, за исключением строки, которую вы хотите удалить. Возможно, вы захотите изменить "\n" на любую строку, заканчивающую ваш файл.

for line in lines:
  if line!="nickname_to_delete"+"\n":
    f.write(line)

В конце закройте файл еще раз.

f.close()
142
ответ дан houbysoft 24 August 2018 в 16:14
поделиться

Лучший и быстрый вариант, а не сохранение всего в списке и повторное открытие файла для его записи, на мой взгляд, для повторной записи файла в другом месте.

with open("yourfile.txt","r") as input:
    with open("newfile.txt","wb") as output: 
        for line in input:
            if line!="nickname_to_delete"+"\n":
                output.write(line)

Вот и все. ! В одном цикле и один вы можете сделать то же самое. Это будет намного быстрее.

17
ответ дан Barnabe 24 August 2018 в 16:14
поделиться

Мне понравился метод fileinput, описанный в этом ответе: Удаление строки из текстового файла (python)

Скажем, например, у меня есть файл с пустыми строками в он и я хочу удалить пустые строки, вот как я его решил:

import fileinput
import sys
for line_number, line in enumerate(fileinput.input('file1.txt', inplace=1)):
    if len(line) > 1:
            sys.stdout.write(line)

Примечание: пустые строки в моем случае имели длину 1

1
ответ дан Deep 24 August 2018 в 16:14
поделиться

Сохраните строки файла в списке, затем удалите список, который вы хотите удалить, и напишите оставшиеся строки в новый файл

with open("file_name.txt", "r") as f:
    lines = f.readlines() 
    lines.remove("Line you want to delete\n")
    with open("new_file.txt", "w") as new_f:
        for line in lines:        
            new_f.write(line)
0
ответ дан Henrique Andrade 24 August 2018 в 16:14
поделиться

В общем, вы не можете; вам нужно снова написать весь файл (по крайней мере, с точки зрения изменения до конца).

В некоторых конкретных случаях вы можете сделать лучше, чем это -

, если все ваши данные элементы имеют одинаковую длину и в определенном порядке, и вы знаете смещение того, с которым хотите избавиться, вы можете скопировать последний элемент над тем, который нужно удалить, и обрезать файл до последнего элемента;

, или вы можете просто перезаписать блок данных значением «это плохие данные, пропустить его» или оставить флаг «этот элемент удален» в ваших сохраненных элементах данных, чтобы вы могли пометить его удалением без изменения файл.

Вероятно, это избыток для коротких документов (что-то под 100 КБ?).

1
ответ дан Hugh Bothwell 24 August 2018 в 16:14
поделиться

Это «вилка» из ответа @ Lother (который, я считаю, следует считать правильным ответом).

Для такого файла:

$ cat file.txt 
1: october rust
2: november rain
3: december snow

вилка из решения Лоутера отлично работает:

#!/usr/bin/python3.4

with open("file.txt","r+") as f:
    new_f = f.readlines()
    f.seek(0)
    for line in new_f:
        if "snow" not in line:
            f.write(line)
    f.truncate()

Усовершенствования:

  • with open, которые отбрасывают использование f.close()
  • более четкими if/else для оценки того, нет ли строки в текущей строке
6
ответ дан ivanleoncz 24 August 2018 в 16:14
поделиться

Не очень хорошо, если вы положили весь файл в память, я знаю, что в настоящее время у каждого есть тонны памяти, но подумайте, есть ли в файле несколько ГБ журналов или что-то в этом роде.

Лучше всего скопировать его строку по строке в новый файл, чем удалить первый или что-то подобное

2
ответ дан Jonnny 24 August 2018 в 16:14
поделиться

Наверное, у вас уже есть правильный ответ, но вот мой. Вместо использования списка для сбора нефильтрованных данных (что делает метод readlines()), я использую два файла. Один из них предназначен для хранения основных данных, а второй для фильтрации данных при удалении определенной строки. Вот код:

main_file = open('data_base.txt').read()    # your main dataBase file
filter_file = open('filter_base.txt', 'w')
filter_file.write(main_file)
filter_file.close()
main_file = open('data_base.txt', 'w')
for line in open('filter_base'):
    if 'your data to delete' not in line:    # remove a specific string
        main_file.write(line)                # put all strings back to your db except deleted
    else: pass
main_file.close()

Надеюсь, вы найдете это полезным! :)

0
ответ дан KernelPanic 24 August 2018 в 16:14
поделиться

Проблема с чтением строк в первом проходе и внесением изменений (удаление определенных строк) во втором проходе заключается в том, что если размеры файлов огромны, у вас закончится ОЗУ. Вместо этого лучший подход состоит в том, чтобы читать строки один за другим и записывать их в отдельный файл, исключая те, которые вам не нужны. Я использовал этот подход с файлами размером до 12-50 ГБ, а использование ОЗУ остается практически неизменным. Только циклы процессоров показывают, что обработка продолжается.

4
ответ дан Kingz 24 August 2018 в 16:14
поделиться

Я думаю, если вы прочитаете файл в списке, то сделайте, вы можете перебирать список, чтобы искать прозвище, от которого вы хотите избавиться. Вы можете сделать это очень эффективно, не создавая дополнительных файлов, но вам придется записать результат обратно в исходный файл.

Вот как я могу это сделать:

import, os, csv # and other imports you need
nicknames_to_delete = ['Nick', 'Stephen', 'Mark']

Я предполагаю, что nicknames.csv содержит такие данные, как:

Nick
Maria
James
Chris
Mario
Stephen
Isabella
Ahmed
Julia
Mark
...

Затем загрузите файл в список:

 nicknames = None
 with open("nicknames.csv") as sourceFile:
     nicknames = sourceFile.read().splitlines()

Затем перейдите к списку, чтобы он соответствовал вашим входам delete:

for nick in nicknames_to_delete:
     try:
         if nick in nicknames:
             nicknames.pop(nicknames.index(nick))
         else:
             print(nick + " is not found in the file")
     except ValueError:
         pass

Наконец, верните результат в файл:

with open("nicknames.csv", "a") as nicknamesFile:
    nicknamesFile.seek(0)
    nicknamesFile.truncate()
    nicknamesWriter = csv.writer(nicknamesFile)
    for name in nicknames:
        nicknamesWriter.writeRow([str(name)])
nicknamesFile.close()
2
ответ дан Laurel 24 August 2018 в 16:14
поделиться

Решение этой проблемы только с одним открытым:

f = open("target.txt","r+")
d = f.readlines()
f.seek(0)
for i in d:
    if i != "line you want to remove...":
        f.write(i)
f.truncate()
f.close()

Это решение открывает файл в режиме r / w («r +») и использует поиск для сброса f-указателя, тогда truncate, чтобы удалить все после последней записи.

66
ответ дан Lother 24 August 2018 в 16:14
поделиться

Возьмите содержимое файла, разделите его на новую строку на кортеж. Затем получите доступ к номеру строки вашего кортежа, присоедините полученный кортеж и перезапишите файл.

-1
ответ дан Nikhil 24 August 2018 в 16:14
поделиться

Если вы используете Linux, вы можете попробовать следующий подход. Предположим, у вас есть текстовый файл с именем animal.txt:

$ cat animal.txt  
dog
pig
cat 
monkey         
elephant  

Удалить первую строку:

>>> import subprocess
>>> subprocess.call(['sed','-i','/.*dog.*/d','animal.txt']) 

, затем

$ cat animal.txt
pig
cat
monkey
elephant
3
ответ дан Ren 24 August 2018 в 16:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: