Используйте второй аргумент консоли как способ удаления строк из текстового файла [duplicate]

Вы можете использовать вызов для команды DOS, но вызов функции в dll windows - лучший способ сделать это.

public struct SystemTime
{
    public ushort Year;
    public ushort Month;
    public ushort DayOfWeek;
    public ushort Day;
    public ushort Hour;
    public ushort Minute;
    public ushort Second;
    public ushort Millisecond;
};

[DllImport("kernel32.dll", EntryPoint = "GetSystemTime", SetLastError = true)]
public extern static void Win32GetSystemTime(ref SystemTime sysTime);

[DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)]
public extern static bool Win32SetSystemTime(ref SystemTime sysTime);

private void button1_Click(object sender, EventArgs e)
{
    // Set system date and time
    SystemTime updatedTime = new SystemTime();
    updatedTime.Year = (ushort)2009;
    updatedTime.Month = (ushort)3;
    updatedTime.Day = (ushort)16;
    updatedTime.Hour = (ushort)10;
    updatedTime.Minute = (ushort)0;
    updatedTime.Second = (ushort)0;
    // Call the unmanaged function that sets the new date and time instantly
    Win32SetSystemTime(ref updatedTime);
}  
93
задан SourD 17 January 2011 в 05:38
поделиться

14 ответов

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

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

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 18 August 2018 в 14:15
поделиться
  • 1
    почему мы должны открывать и закрывать его дважды? – Ooker 25 June 2014 в 14:48
  • 2
    @Ooker: вам нужно дважды открыть файл (и закрыть его между ними), потому что в первом режиме это «только для чтения». потому что вы просто читаете текущие строки в файле. Затем вы закрываете его и повторно открываете в «режиме записи», где файл доступен для записи, и вы заменяете содержимое файла без строки, которую хотите удалить. – Devin 1 July 2014 в 17:19
  • 3
    Почему Python не позволяет нам делать это в одной строке? – Ooker 1 July 2014 в 17:37
  • 4
    @Ooker, Когда вы читаете строку, попробуйте представить, что курсор перемещается вдоль линии по мере ее чтения. Как только эта строка была прочитана, курсор теперь проходит мимо нее. Когда вы пытаетесь записать в файл, вы пишете, где находится курсор. Повторно открыв файл, вы сбросите курсор. – Waddas 6 August 2014 в 21:48
  • 5
    Используйте соединение вместе! – EcbM 20 September 2016 в 15:37

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

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)

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

16
ответ дан Barnabe 18 August 2018 в 14:15
поделиться
  • 1
    очень хорошо! но выходной файл должен быть установлен в 'w' not 'r' – yan bellavance 13 November 2014 в 21:15
  • 2
    конечно. Спасибо за исправление, сразу это изменит. – Barnabe 14 November 2014 в 10:28
  • 3
    на самом деле, вы можете написать '' для строки во входном файле '' или '' для строки во входном файле file.readlines () '', он делает то же самое на моей стороне (Python 2.7) – Barnabe 14 November 2014 в 10:33
  • 4
    @ShriShinde. Вы не читаете файл в памяти при циклическом перемещении по файловому объекту, так что это решение работает так же, как и ваше предложение. – Steinar Lima 27 February 2016 в 08:18
  • 5
    os.replace (новый в python v 3.3) является более кросс-платформенным, чем системный вызов mv. – 7yl4r 15 November 2017 в 16:30

Мне понравился метод 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 18 August 2018 в 14:15
поделиться

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

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 18 August 2018 в 14:15
поделиться

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

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

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

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

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

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

Это «вилка» из ответа @ 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 18 August 2018 в 14:15
поделиться

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

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

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

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

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

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

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

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

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 18 August 2018 в 14:15
поделиться

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

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 18 August 2018 в 14:15
поделиться
  • 1
    Это работало очень хорошо для меня, поскольку мне также пришлось использовать lockfile (fcntl). Я не мог найти способ использовать fileinput вместе с fcntl. – Easyrider 27 January 2015 в 15:07
  • 2
    Мне нравится это решение! Было бы еще лучше, если бы он использовал with open(...), а затем он мог бы сбросить f.close() – Grezzo 2 June 2017 в 13:42
  • 3
    Было бы неплохо увидеть некоторые побочные эффекты этого решения. – user1767754 23 November 2017 в 09:43

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

-1
ответ дан Nikhil 18 August 2018 в 14:15
поделиться
  • 1
    (1) Вы имеете в виду tuple(f.read().split('\n')) ?? (2) "доступ к номеру строки вашего кортежа" и "присоединиться к вашему исходному кортежу". звук довольно таинственный; фактический код Python может быть более понятным. – John Machin 17 January 2011 в 05:49

Если вы используете 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
2
ответ дан Ren 18 August 2018 в 14:15
поделиться
  • 1
    Это решение не является агностическим для ОС, и поскольку OP не указала операционную систему, нет никаких причин для публикации конкретного ответа Linux imo. – Steinar Lima 27 February 2016 в 08:20
0
ответ дан ungalcrys 30 October 2018 в 04:56
поделиться
Другие вопросы по тегам:

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