Как удалить строку в файле python
Перейти к содержимому

Как удалить строку в файле python

  • автор:

Как удалить определённую строку из .txt файла

Я хочу найти в файле users.txt определённую строку (например, СОДЕРЖАЩУЮ «Привет» ), и удалить эту строку. Я облазил всё — ничего не нашел с моим случаем. И да — покажите легко, не нужно делать огромные непонятные коды. Задача проста — найти и удалить определённую строку из .txt файла

Отслеживать
16k 4 4 золотых знака 19 19 серебряных знаков 30 30 бронзовых знаков
задан 5 фев 2019 в 9:33
vaytonqueen vaytonqueen
81 1 1 золотой знак 1 1 серебряный знак 9 9 бронзовых знаков
Оффтоп: Даже если задача звучит просто, это не значит, что она проста в реализации.
5 фев 2019 в 9:37

А что может быть сложного в ПРОСТОМ УДАЛЕНИИ строки? Я понимаю, сам не умею т.к. начинающий. Но логично же — просто удалить строку.

5 фев 2019 в 9:39

И что по вашему код должен сделать после line.clear()? Допустим, он очистит место на диске, которое занимает эта строчка. Но файл по прежнему будет иметь ту же длину, только теперь с последовательностью нулевых байт в середине, там, где была строка! По любому нужно как минимум сместить все строки, которые идут после удалённой.

5 фев 2019 в 10:05

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

5 фев 2019 в 10:07

@Vayton, если вы в текстовом редакторе удалите одну строчку из текстового файла в котором 1.000.000 строк, то текстовый редактор пересоздаст файл и запишет в него 999.999 строк.

5 фев 2019 в 11:07

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Открываем файл для чтения.
Сохраняем все строки в массив lines

Открываем файл для записи.
Проходим по массиву строк и сравниваем с искомой строкой.
Если строка не найдена — записываем строку в файл.

UPD. С учетом предложений @MaxU

#!/usr/bin/env python3 import re with open('f.txt') as f: lines = f.readlines() str = 'Hello' pattern = re.compile(re.escape(str)) with open('f.txt', 'w') as f: for line in lines: result = pattern.search(line) if result is None: f.write(line) 

Или почти тоже самое, но в один проход (но я за первый вариант)

#!/usr/bin/env python3 import re str = 'Hello' pattern = re.compile(re.escape(str)) with open('f.txt', 'r+') as f: lines = f.readlines() f.seek(0) for line in lines: result = pattern.search(line) if result is None: f.write(line) f.truncate() 

Удаление строк файла

нужно удалить все строки из «test.txt» в которых есть к примеру комбинация «0000»или «replice»
Подскажите код на Python.

1 2 3 4 5 6 7 8
with open("TEST.txt", "r") as f: lines = f.readlines() with open("TEST.txt", "w") as f: for line in lines: if line.strip("\n") != "0000": f.write(line) for item in list: f.write("%s\n" % item)

— Не сохраняется результат в отдельный файл. Редактирует сам файл TEST.txt
— удаляет строки где есть просто комбинация 0000. Но остальные не удаляет: 0000test, test0000tset.

input:
test
0000
test0000
test0000test
0000

output:
test
test0000 — не удаляется
test0000test — не удаляется

Лучшие ответы ( 3 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Удаление дубликатов строк из файла
есть два списка доменов list1 и list2 list1 — список на 10+ млн list2 — каждый раз новый нужно.

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

Удаление строк из файла используя регулярное выражение
Добрый день! Нужно в файлах в текущей директории заменить на —deleted— все строки, содержащие.

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

504 / 163 / 51
Регистрация: 12.02.2023
Сообщений: 604

Лучший ответ

Сообщение было отмечено Cyber_F как решение

Решение

1 2 3 4 5 6
with open("TEST.txt", "r") as f: lines = f.readlines() with open("RESULT_TEST.txt", "w") as f: for line in lines: if line.find('0000') and line.find('replice') == -1: f.write(line)

2738 / 1219 / 438
Регистрация: 21.11.2021
Сообщений: 2,474

Лучший ответ

Сообщение было отмечено Cyber_F как решение

Решение

1 2 3
lines = open('TEST.txt').readlines() lines = [x for x in lines if not '0000' in x and not 'replice' in x] open('RESULT_TEST.txt', 'w').writelines(lines)

504 / 163 / 51
Регистрация: 12.02.2023
Сообщений: 604

if line.find('0000') == -1 and line.find('replice') == -1:
1 2 3
with open('TEST.txt', 'r') as f, open('RESULT_TEST.txt', 'w') as g: for line in f: g.write(line if line.find('0000') == -1 and line.find('replice') == -1 else '')

2738 / 1219 / 438
Регистрация: 21.11.2021
Сообщений: 2,474
Ну или так:

lines = filter(lambda x: not '0000' in x and not 'replice' in x, open('TEST.txt').readlines()) open('RESULT_TEST.txt', 'w').writelines(lines)

Добавлено через 43 минуты
s_t_r_a_j, ну или так:

1 2 3
with open('RESULT_TEST.txt', 'w') as g: for s in open('TEST.txt'): g.write(s if not '0000' in s and not 'replice' in s else '')

Любознательный
3963 / 1346 / 285
Регистрация: 10.03.2016
Сообщений: 3,110

Лучший ответ

Сообщение было отмечено Cyber_F как решение

Решение

1 2 3 4 5 6 7
import re fw = open('out.txt', 'w', encoding='utf-8') with open('test.txt', 'r', encoding="utf-8") as f: while line := f.readline(): if not re.search(r'0000|replice', line): fw.writelines(line) fw.flush()

2738 / 1219 / 438
Регистрация: 21.11.2021
Сообщений: 2,474
Еще вариант:

with open('RESULT_TEST.txt', 'w') as g: [g.write(s) for s in open('TEST.txt') if not '0000' in s and not 'replice' in s]

Регистрация: 23.02.2014
Сообщений: 174

ЦитатаСообщение от s_t_r_a_j Посмотреть сообщение

PythonВыделить код
1
2
3
4
5
6
with open(«TEST.txt», «r») as f:
lines = f.readlines()
with open(«RESULT_TEST.txt», «w») as f:
for line in lines:
if line.find(‘0000’) and line.find(‘replice’) == -1:
f.write(line)
__________________

test0000 — не удаляет

ЦитатаСообщение от idealist Посмотреть сообщение

PythonВыделить код
1
2
3
lines = open(‘TEST.txt’).readlines()
lines = [x for x in lines if not ‘0000’ in x and not ‘replice’ in x]
open(‘RESULT_TEST.txt’, ‘w’).writelines(lines)

удаляет ненужные строки.

ЦитатаСообщение от s_t_r_a_j Посмотреть сообщение

все-таки
PythonВыделить код
1
if line.find(‘0000’) == -1 and line.find(‘replice’) == -1:

с исправлением и последующий вариант запустилось норм.

Всем большое Спасибо, все варианты запустились.

Добавлено через 3 часа 24 минуты
возник один нюанс, программа не сохраняет результат пока не обработает весь файл. Из-за этого забивается вся оперативка по максимум. На пк сделать ничего нельзя, все сразу фризится.
Есть код для cmd:
$ find /v «0000»& >nul move $ file.txt
— он сохраняет результат постепенно в отдельный файл. Из-за этого нет нагрузки на оперативку.

Можно это как то исправить?

2738 / 1219 / 438
Регистрация: 21.11.2021
Сообщений: 2,474

ЦитатаСообщение от Cyber_F Посмотреть сообщение

возник один нюанс, программа не сохраняет результат пока не обработает весь файл. Из-за этого забивается вся оперативка по максимум.

Ну, вот так будет каждую строку сразу записывать:

1 2 3 4 5
with open('RESULT_TEST.txt', 'w') as g: for s in open('TEST.txt'): if not '0000' in s and not 'replice' in s: g.write(s) g.flush()

Регистрация: 23.02.2014
Сообщений: 174

ЦитатаСообщение от idealist Посмотреть сообщение

Ну, вот так будет каждую строку сразу записывать:
PythonВыделить код
1
2
3
4
5
with open(‘RESULT_TEST.txt’, ‘w’) as g:
for s in open(‘TEST.txt’):
if not ‘0000’ in s and not ‘replice’ in s:
g.write(s)
g.flush()

спс, не нагружает оперативку и быстрее стало обрабатывать.
Регистрация: 23.02.2014
Сообщений: 174

ЦитатаСообщение от idealist Посмотреть сообщение

Ну, вот так будет каждую строку сразу записывать
— а можно указать несколько комбинаций. К примеру: 0000, 1111 и т.д.?
2738 / 1219 / 438
Регистрация: 21.11.2021
Сообщений: 2,474

ЦитатаСообщение от Cyber_F Посмотреть сообщение

а можно указать несколько комбинаций. К примеру: 0000, 1111 и т.д.?

Ну, так-то все можно, только изложите необходимое логическое условие полностью, а то не очень понятно.

Регистрация: 23.02.2014
Сообщений: 174

ЦитатаСообщение от idealist Посмотреть сообщение

Ну, так-то все можно, только изложите необходимое логическое условие полностью, а то не очень понятно.

в коде , указана одна комбинация «0000» для поиска и удаления(перезаписи):

ЦитатаСообщение от idealist Посмотреть сообщение

with open(‘RESULT_TEST.txt’, ‘w’) as g:
for s in open(‘TEST.txt’):
if not ‘0000’ in s and not ‘replice’ in s:
g.write(s)
g.flush()

как указать несколько символов? к примеру: 0000, 1111, dog, cat и т.д.

with open(‘RESULT_TEST.txt’, ‘w’) as g:
for s in open(‘TEST.txt’):
if not ‘0000‘ in s or not ‘1111‘ in s and not ‘replice’ in s:
g.write(s)
g.flush()

2738 / 1219 / 438
Регистрация: 21.11.2021
Сообщений: 2,474

ЦитатаСообщение от Cyber_F Посмотреть сообщение

в коде , указана одна комбинация «0000» для поиска и удаления(перезаписи)

ЦитатаСообщение от Cyber_F Посмотреть сообщение

как указать несколько символов? к примеру: 0000, 1111, dog, cat и т.д.
Ну, так можно:

1 2 3 4 5 6
with open('RESULT_TEST.txt', 'w') as g: for s in open('TEST.txt'): bad_words = ['0000', '1111', 'dog', 'cat'] if not any(x in s for x in bad_words): g.write(s) g.flush()

Регистрация: 23.02.2014
Сообщений: 174

ЦитатаСообщение от idealist Посмотреть сообщение

with open(‘RESULT_TEST.txt’, ‘w’) as g:
for s in open(‘TEST.txt’):
bad_words = [‘0000’, ‘1111’, ‘dog’, ‘cat’]
if not any(x in s for x in bad_words):
g.write(s)
g.flush()

спс, чистит хорошо, без нагрузки.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Удаление строк из файла
Как можно удалить из файла все строчки , которые начинаются с # ?

Удаление строк из файла
Вопрос такой. У меня на сайте есть гостевая книга, я не стал делать ее через БД. Решил сделать.

Удаление строк из файла
Всем привет. У меня к вам просьба. Мне нужна программа, которая удаляла бы n-количество строк.

Удаление строк из файла
Дан текстовый файл. Удалить из него первую и последнюю строку. Вопрос: как загрузить сам файл? И.

Удаление строк из файла
Здравствуйте. В общем, необходимо удалить запись из файла..добавление сделал.. а удалению не могу.

Удаление строк из файла
Вопрос: Как можно из файла, содержащего n строк удалить к-ую сторку, неперезаписывая файл. .

Вставка/удаление строк/столбцов, перемещение диапазона ячеек

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

Содержание:

  • Вставка строк и столбцов.
  • Удаление строк и столбцов.
  • Перемещение диапазона ячеек.

Вставка строк и столбцов.

Модуль openpyxl поддерживает вставку строк или столбцов. Чтобы произвести указанные действия, необходимо использовать соответствующие методы экземпляра рабочего листа Worksheet :

  • Worksheet.insert_cols(idx, amount=1) : вставляет столбец или столбцы перед col==idx . Аргумент amount — количество добавляемых столбцов.
  • Worksheet.insert_rows(idx, amount=1) : вставляет строку или строки перед row==idx . Аргумент amount — количество добавляемых строк.

По умолчанию вставляется одна строка или столбец. Например, чтобы вставить одну строку перед существующей 7-ой строкой необходимо вызвать ws.insert_rows(7) .

>>> from openpyxl import Workbook >>> wb = Workbook() >>> ws = wb.active # создадим произвольные данные >>> data = [[row*col for col in range(1, 16)] for row in range(1, 31)] # добавляем данные на активный лист >>> for row in data: . ws.append(row) . # вставим 3 новые строки перед # существующей 7-ой строкой >>> ws.insert_rows(7, 3) # сохраняем и смотрим >>> wb.save('test.xlsx') 

Удаление строк и столбцов.

Что бы удалить строки или столбцы, используйте следующие методы экземпляра рабочего листа Worksheet :

  • Worksheet.delete_cols() : удаляет столбец или столбцы, начиная с col==idx . Аргумент amount — количество удаляемых столбцов.
  • Worksheet.delete_rows() : удаляет строку или строки, начиная с row==idx . Аргумент amount — количество удаляемых строк.

По умолчанию удаляется одна строка или столбец. Например, чтобы удалить столбцы в диапазоне F:H необходимо вызвать ws.delete_cols(6, 3) .

Пример — продолжение предыдущего:

# удалим 3 столбцы в диапазоне `F:H` >>> ws.delete_cols(6, 3) # сохраняемся и открываем файл >>> wb.save('test.xlsx') 

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

Перемещение диапазона ячеек.

Модуль openpyxl обеспечивает перемещение диапазонов ячеек внутри листа методом:

  • Worksheet.move_range(cell_range, rows=0, cols=0, translate=False) .

Этот метод перемещает диапазон ячеек cell_range на количество строк rows и/или столбцов cols :

  • вниз, если rows > 0 , и вверх, если rows < 0 ,
  • вправо, если cols > 0 , и влево, если cols < 0 .

Существующие ячейки будут перезаписаны. Формулы и ссылки обновляться не будут.

>>> ws.move_range("D4:F10", rows=-1, cols=2) 

Это приведет к перемещению ячеек в диапазоне ячеек D4:F10 вверх на одну строку и вправо на два столбца. Ячейки будут перезаписаны всеми существующими ячейками.

Если ячейки содержат формулы, то openpyxl может транслировать их, но, поскольку это не всегда то, что нужно, по этому этот функционал умолчанию отключен. Кроме того, будут транслированы только формулы в самих ячейках. Ссылки на ячейки из других ячеек или определенные имена обновляться не будут. Для этого можно использовать переводчик формул синтаксического анализа:

>>> ws.move_range("G4:H10", rows=1, cols=1, translate=True) 

Это приведет к перемещению относительных ссылок в формулах в диапазоне на одну строку и один столбец.

  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Встроенные в Excel формулы и модуль openpyxl
  • Как установить формат в ячейку Excel модулем openpyxl
  • Работа с форматированным текстом, модуль openpyxl
  • Работа со стилями текста и ячеек, модуль openpyxl
  • Как объединить/разъединить ячейки, модулем openpyxl
  • Как изменить размеры строки/столбца модулем openpyxl
  • Как закрепить строки/столбцы как шапку, модулем openpyxl
  • Настройка печати/просмотра документа в Excel модулем openpyxl
  • Вставка/удаление строк и столбцов, перемещение ячеек, модуль openpyxl
  • Обработка больших файлов XLSX модулем openpyxl
  • Работа с Pandas и поддержка NumPy, модуль openpyxl
  • Проверка данных при заполнении ячеек, модуль openpyxl
  • Именованные диапазоны ячеек в модуле openpyxl
  • Работа с объектом Table() модуля openpyxl
  • Защита книги и рабочего листа, модуля openpyxl
  • Добавление изображений в XLSX-документ, модуль openpyxl
  • Стиль ячеек по условию, модуль openpyxl
  • Создание диаграмм средствами модуля openpyxl
  • Класс Workbook() модуля openpyxl
  • Объект Worksheet модуля openpyxl
  • Объект ячейки Cell модуля openpyxl
  • Функции преобразования ячеек модуля openpyxl

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

Есть много_txt_файлов и еще один с данными. Нужно удалить из файла с данными строку если в много_txt_файлов не нашлось совпадения.

в файле с данными 4000 строк, одно значение в строке, много_txt_файлов 1900 штук, три значения в строке

хочется более менее простого решения, в чем смогу сам разобраться если вдруг понадобится внести изменения

знаю что бесплатно никто не работает) оставите координаты отправлю немного на чтосамирешите)

xohox
02.10.21 18:05:58 MSK

Зачем тебе grep и прочие Shell-костыли для этого? Возьми какой-нибудь нормальный ЯП, например, Python и сделай всё с его помощью.

EXL ★★★★★
( 02.10.21 18:08:28 MSK )

Нужно удалить из файла с данными строку если в много_txt_файлов не нашлось совпадения.

Может наоборот? Добавлять в новый файл строку если grep пустой?

anonymous
( 02.10.21 18:13:24 MSK )

Цикл, awk и [ в помощь.

anonymous
( 02.10.21 18:17:09 MSK )

#!/usr/bin/bash data_file="$1" many_files_dir="$2" tmp_file=$(mktemp) cat "$data_file" | while read line; do if grep -Fqr "$line" "$many_files_dir"; then echo "$line" >> "$tmp_file" fi done mv "$tmp_file" "$data_file" 

Я не проверял, конечно. И это, по идее, должно работать, только если строки идеально совпадают. Если надо прям значения сравнивать, без учёта пробелов, то такой вариант не подойдёт.

anonymous
( 02.10.21 18:25:02 MSK )
Ответ на: комментарий от anonymous 02.10.21 18:25:02 MSK

Может быть ещё -x стоит добавить к аргументам grep.

anonymous
( 02.10.21 18:30:46 MSK )

Можно решать задачу по другому.

Читаешь файл построчно и ищешь совпадения в файлах, если нашлось заносить строку в другой новый файл ( в один и тот же).

В конце получаешь новый файл в котором только строки что нашлись.

anonymous
( 02.10.21 20:48:39 MSK )

… знаю что бесплатно никто не работает)

Почему же?
Многим помогают, кто приводит код и говорит о проблемах.
А те кто просто просят СДЕЛАЙТЕ МНЕ, тех в job /жопу по просто народному/ отсылают …

anonymous
( 02.10.21 20:57:08 MSK )
Ответ на: комментарий от anonymous 02.10.21 18:25:02 MSK

Что-то не взлетает, записывает в новый файл значения из data_file, на этом всё. Строки конечно же не совпадают.

строки в файлах в many_files_dir

76.9.16.1:3510 47.16.38.12:55194 ESTABLISHED 76.9.16.1:35356 19.197.55.71:51152 SYN_SENT

строки в data_file

по моей задумке в новый файл должен попасть только 47.16.38.12

сможешь что-то с этим сделать?

xohox
( 02.10.21 20:59:17 MSK ) автор топика
Ответ на: комментарий от anonymous 02.10.21 20:57:08 MSK

Можно в job попросить модератора перенести, но я ж вроде написал, что готов материально отблагодарить.

Могу и сам сидеть ковыряться, но, как всегда, нужно сейчас. Поэтому и обратился.

xohox
( 02.10.21 21:02:09 MSK ) автор топика
Ответ на: комментарий от xohox 02.10.21 21:02:09 MSK

Могу и сам сидеть ковыряться, но, как всегда, нужно сейчас.

Вы анализируете лог файл.
Что вы хотите найти в нем?

anonymous
( 02.10.21 21:04:23 MSK )

touch result.txt for w in `cat data.txt` do if [ -z `grep -r $w ./filesdir/` ] then echo $w >> results.txt fi done mv results.txt data.txt 

AKonia ★★
( 02.10.21 21:08:46 MSK )
Ответ на: комментарий от xohox 02.10.21 20:59:17 MSK

Ну, по логике всё должно быть как ты хочешь. Может быть у тебя файл с данными в той же папке лежит, что и txt-файлы?

anonymous
( 02.10.21 21:22:49 MSK )
Ответ на: комментарий от xohox 02.10.21 20:59:17 MSK

Проверил на вот этих твоих данных сейчас. Структура файлов такая:

./script.sh ./data.txt ./txt/f.txt 
$ cat data.txt 47.16.38.12 1.1.9.5 $ cat txt/f.txt 76.9.16.1:3510 47.16.38.12:55194 ESTABLISHED 76.9.16.1:35356 19.197.55.71:51152 SYN_SENT 
$ ./script.sh data.txt txt $ cat data.txt 47.16.38.12 

То есть пропала запись 1.1.9.5 . Так ведь надо было?

anonymous
( 02.10.21 21:32:28 MSK )

grep -v 'pattern' file > newfile 

anonymous
( 02.10.21 21:49:47 MSK )
Ответ на: комментарий от AKonia 02.10.21 21:08:46 MSK

Хочу оставить в data файле только ip с которых подключаются и удалить те, с которых подключения прекратились.

Ругается вот так

./start ./start: line 6: [: too many arguments ./start: line 6: [: too many arguments ./start: line 6: [: too many arguments

шестая строка if [ -z grep -r $w /root/test/ ]

выдает три строки с ошибками, но в data файле четыре строки

cat data 185.155.99.55 37.70.201.228 94.130.57.235 1.1.9.5

xohox
( 02.10.21 22:08:00 MSK ) автор топика
Ответ на: комментарий от anonymous 02.10.21 21:32:28 MSK

мой косяк, все работает)

xohox
( 02.10.21 22:13:23 MSK ) автор топика
Ответ на: комментарий от anonymous 02.10.21 21:32:28 MSK

напиши, пожалуйста, куда удобно будет отправить оплату

xohox
( 02.10.21 22:14:24 MSK ) автор топика
Ответ на: комментарий от xohox 02.10.21 22:14:24 MSK

Да ничего не надо. Купи жене или маме цветы 🙂

anonymous
( 02.10.21 23:11:45 MSK )
Ответ на: комментарий от anonymous 02.10.21 23:11:45 MSK

может на телефон отправить? напиши номер в личку, а то ты время тратишь, а пользуюсь я, неправильно это

результат теста, мало ли интересно, из 4000 строк осталось 130) огонь)

xohox
( 03.10.21 00:38:59 MSK ) автор топика
Ответ на: комментарий от xohox 03.10.21 00:38:59 MSK

Для меня это было несложно. Потратил я минут 5 на то, что мне в было интересно, что в этом неправильного? Но спасибо, что проявляешь ответственность 🙂

Тот твой огонь из моего окна не видно, к сожалению. А не думал завести БД под свои файлы? Возможно с языком запросов все твои задачи решались бы проще. Или, как тут правильно советуют, попробуй анализатор логов какой-нибудь, там уже должны быть решены все типовые задачи. Какой именно — я тебе не смогу посоветовать, так как сам ими не пользуюсь.

anonymous
( 03.10.21 01:17:10 MSK )
Ответ на: комментарий от anonymous 03.10.21 01:17:10 MSK

Тут какая штука, этот data файл собирался более года. Теперь я его почищу и это снова на год хватит. Анализатор/парсер у меня есть, это perl скрипт, 100 000 строк за одну секунду обрабатывает. Я вот только не знал как убрать уже не используемые.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *