использование Python для удаления определенной строки в файле

Допустим, у меня есть текстовый файл, полный псевдонимов. Как я могу удалить определенный ник из этого файла, используя Python?

Ответ 1

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

with open("yourfile.txt", "r") as f:
    lines = f.readlines()
with open("yourfile.txt", "w") as f:
    for line in lines:
        if line.strip("\n") != "nickname_to_delete":
            f.write(line)

Вам нужно strip("\n") символ новой строки в сравнении, потому что если ваш файл не заканчивается символом новой строки, то и последняя line не будет.

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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


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

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

Эта вилка от Lother Solution отлично работает:

#!/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 для оценки, если строка не присутствует в текущей строке

Ответ 5

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

Ответ 6

Мне понравился метод 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

Ответ 7

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

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

Ответ 8

Если вы используете 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

Ответ 9

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

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

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

Затем перейдите к списку в соответствии с вашими входом для удаления:

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

Ответ 10

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

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

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

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

Это, вероятно, слишком много для коротких документов (что-то под 100 КБ?).

Ответ 11

Возможно, у вас уже есть правильный ответ, но вот мой. Вместо использования списка для сбора нефильтрованных данных (что делает метод 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()

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

Ответ 12

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

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)

Ответ 13

здесь какой-то другой метод, чтобы удалить/некоторые строки из файла:

src_file = zzzz.txt
f = open(src_file, "r")
contents = f.readlines()
f.close()

contents.pop(idx) # remove the line item from list, by line number, starts from 0

f = open(src_file, "w")
contents = "".join(contents)
f.write(contents)
f.close()

Ответ 14

Мне нравится этот метод с использованием fileinput и метода "inplace":

import fileinput
for line in fileinput.input(fname, inplace =1):
    line = line.strip()
    if not 'UnwantedWord' in line:
        print(line)

Это немного менее многословно, чем другие ответы и достаточно быстро для

Ответ 15

  Вы можете использовать библиотеку re

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

# Delete unwanted characters
import re

# Read, then decode for py2 compat.
path_to_file = 'data/nicknames.txt'
text = open(path_to_file, 'rb').read().decode(encoding='utf-8')

# Define unwanted nicknames and substitute them
unwanted_nickname_list = ['SourDough']
text = re.sub("|".join(unwanted_nickname_list), "", text)

Ответ 16

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