list, поиск подстроки в item

mlorin

Новичок
Пользователь
Июл 8, 2024
2
0
1
Всем привет.
использую Win 7, Python 3.7.2
Package Version
--------------- --------
beautifulsoup4 4.12.2
bs4 0.0.1
distro 1.8.0
et-xmlfile 1.0.1
future 0.17.1
html2excel 0.0.6
html5lib 1.1
iso8601 0.1.12
numpy 1.21.6
openpyxl 3.0.7
openpyxl-stubs 0.1.19
pandas 1.3.5
pip 24.0
python-dateutil 2.8.2
pytz 2022.7.1
PyYAML 3.13
serial 0.0.91
setuptools 40.6.2
six 1.16.0
soupsieve 2.4.1
tabula-py 2.6.0
webencodings 0.5.1
xlrd 2.0.1

Прошу пояснить, у меня задача просканировать файл и по условию удалить строки. Решил загрузить файл в list и далее проверять каждый item соответствует ли он условию, если да, то удалить. Однако не понимаю, как в лист загрузить строки, что бы целая строка была item, что бы можно было выполнить поиск подстроки. Возможно у меня вообще не правильный подход при решении данной задачи, может это решается как то иначе? Надеюсь изложил понятно свою проблему. Заранее спасибо.

код примера
Код:
''' содержание файла
ru form
by desi
en sell
ro korp
'''
FILENAMEIN = 'filename.txt'

lst = []
it = 'ru' # условие поиска, хочу удалить строку содержащую 'ru'

with open(FILENAMEIN, 'r') as fi:
    for line in fi.readlines():
        lst.append([x for x in line.strip()])
    fi.close

print('\n')
print('\nItem for search: ', it)
for item in lst:
    if it in item:
        n = lst.index(item)
        print('\nFound item index: ', lst.index(item), '\n')
        print('\nFound item index: ', n, '\n')
        lst.pop(n)
        print('\n----',lst[n])
    else:
        print('\nNot found item index')


print('\n', lst, end = '\n')
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
944
210
43
20
Москва
Python:
FILENAMEIN = 'filename.txt'

lst = []
it = 'ru' # условие поиска, хочу удалить строку содержащую 'ru'

with open(FILENAMEIN, 'r') as fi:
    for line in fi:
        if it not in line:
            lst.append(line)

print(''.join(lst))

В целом вот так, close не нужен, он и так сработает, лучше не изменять список во время итерации по нему, это может легко привести к непредвиденному поведению (например к потере элементов), так же при работе с файлами лучше читая строку за строкой, сразу обрабатывать их, а не сохранять куда-то и только потом с ними работать, при большом объёме информации это может дать прирост к скорости (тут можно и без этого)
 

mlorin

Новичок
Пользователь
Июл 8, 2024
2
0
1
Спасибо большое за предложенный пример. Решил, что правильнее обрабатывать строки сразу с помощью regex, не используя array или list, как Вы и предложили в комментарии.

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

Пока писал, подумал, что Вы наверно имеете ввиду обработку строк в потоке. Вот как у меня получилось.
Код:
with open(INFILE, encoding=ENC) as fi, open(OUTFILE, "w", encoding=ENC) as fo:
    for line in fi:
        if re.match(pattern, line): # поиск вхождения
            line = re.sub(r'\s+', ' ', line) # удаление лишних пробелов
            fo.write(line +'\n')

Еще не понял, ведь я использую close для закрытия файла.
1. Открыл файл (open)
2. выгрузил данные (append)
3. закрыл файл. (close)
Далее выполняю работу с копией данных в памяти, которая сохранена в виде структуры (list). Как закрытие закрытие файла может повлиять на данные сохраненные в памяти? Наверно что то не понимаю.
..close не нужен, он и так сработает, лучше не изменять список во время итерации по нему..

Заранее прошу прощения, возможно вопросы звучат глупо, но только начинаю разбираться с этим.
 
Последнее редактирование:

PYDEV

Пользователь
Пользователь
Авг 31, 2023
42
9
8
1. Открыл файл (open)
2. выгрузил данные (append)
3. закрыл файл. (close)
Почитайте -> https://habr.com/ru/articles/739326/
 
  • Мне нравится
Реакции: Vershitel_sudeb

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
944
210
43
20
Москва
Пока писал, подумал, что Вы наверно имеете ввиду обработку строк в потоке. Вот как у меня получилось.
Да, это я и имел ввиду, не сохранять всё в промежуточный массив, а сразу обрабатывать выкидывая ненужное.
 

Форум IT Специалистов