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

Как в файле найти нужное слово python

  • автор:

Файлы. Работа с файлами.

Python 3 логотип

В данной статье мы рассмотрим встроенные средства python для работы с файлами: открытие / закрытие, чтение и запись.

Итак, начнем. Прежде, чем работать с файлом, его надо открыть. С этим замечательно справится встроенная функция open:

У функции open много параметров, они указаны в статье "Встроенные функции", нам пока важны 3 аргумента: первый, это имя файла. Путь к файлу может быть относительным или абсолютным. Второй аргумент, это режим, в котором мы будем открывать файл.
Режим Обозначение
‘r’ открытие на чтение (является значением по умолчанию).
‘w’ открытие на запись, содержимое файла удаляется, если файла не существует, создается новый.
‘x’ открытие на запись, если файла не существует, иначе исключение.
‘a’ открытие на дозапись, информация добавляется в конец файла.
‘b’ открытие в двоичном режиме.
‘t’ открытие в текстовом режиме (является значением по умолчанию).
‘+’ открытие на чтение и запись

Режимы могут быть объединены, то есть, к примеру, ‘rb’ — чтение в двоичном режиме. По умолчанию режим равен ‘rt’.

И последний аргумент, encoding, нужен только в текстовом режиме чтения файла. Этот аргумент задает кодировку.

Чтение из файла

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

Первый — метод read, читающий весь файл целиком, если был вызван без аргументов, и n символов, если был вызван с аргументом (целым числом n).

Ещё один способ сделать это — прочитать файл построчно, воспользовавшись циклом for:

Запись в файл

Теперь рассмотрим запись в файл. Попробуем записать в файл вот такой вот список:

Откроем файл на запись:

 Запись в файл осуществляется с помощью метода write:
 

После окончания работы с файлом его обязательно нужно закрыть с помощью метода close:

 Теперь попробуем воссоздать этот список из получившегося файла. Откроем файл на чтение (надеюсь, вы поняли, как это сделать?), и прочитаем строки.
   Мы получили тот же список, что и был. В более сложных случаях (словарях, вложенных кортежей и т. д.) алгоритм записи придумать сложнее. Но это и не нужно. В python уже давно придумали средства, такие как pickle или json, позволяющие сохранять в файле сложные структуры.

Для вставки кода на Python в комментарий заключайте его в теги

  • Модуль csv - чтение и запись CSV файлов
  • Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
  • Онлайн-обучение Python: сравнение популярных программ
  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов
  • Сделай свой вклад в развитие сайта!
  • Самоучитель Python
  • Карта сайта
  • Отзывы на книги по Python
  • Реклама на сайте

Python – наше всё: поиск строк в файле по ключевым словам

Есть решение, как с помощью Python осуществить поиск строк в файле по ключевым словам в столбцах.

Несомненно, многие из нас в своей работе не раз сталкивались с необходимостью фильтрации данных в файле excel, обычно мы делаем это через встроенный в программу фильтр, но бывают ситуации, когда нужно осуществить отбор строк по большому количеству условий (в нашем случае – по ключевым словам) сразу по нескольким столбцам.

Рассмотрим задачу более подробно. Например, у нас есть файл excel с обращениями клиентов в банк (тысячи строк), который содержит следующие колонки: «ИНН клиента», «Дата обращения», «Обращение», «Решение». В столбце «Обращение» содержится текст обращения клиента, в столбце «Решение» - ответ банка на обращение. Суть обращений может быть абсолютно любой (кредитование, страхование, эквайринг и т.д).

Требуется с помощью поиска ключевых слов/сочетаний слов (например, «КАСКО», «ОСАГО», «автострахов», «залог…авто» и т.п.) в колонках «Обращение» и «Решение» выбрать обращения клиентов, которые относятся к страхованию автотранспорта. Нужные слова могут содержаться как в обоих столбцах, так и в одном из них.

Конечно, можно начать фильтровать данные колонки в excel, но это будет долго и трудоёмко, особенно, если слов для поиска подходящих обращений много (или столбцов, в которых необходимо найти ключевые слова). Поэтому для решения нашей задачи требуется более удобный инструмент – Python.

Ниже представлен код, с помощью которого мы отберем необходимые обращения клиентов:

# Импорт библиотек. import pandas as pd import numpy as np import re #Чтение исходного файла с данными. df = pd.read_excel(r'ПУТЬ К ФАЙЛУ\Название исходного файла с данными.xlsx', dtype='str') # Регулярные выражения. # Шаблон (слова/сочетания слов, которые необходимо найти в столбцах). r = r'(каско)|(осаго)|(страх.*?транспорт)|(транспорт.*?страх)|(страх.*?авто)|(авто.*?страх)|(залог.*?транспорт)|(транспорт.*?залог)|(залог.*?авто)|(авто.*?залог)|(автострахов)'

Поясним, что «.*?» в выражении (страх.*?транспорт) ищет между «страх» и «транспорт» любое количество символов, вопросительный знак отключает жадность алгоритма поиска (поиск заканчивается как только находится первый «транспорт»).

#Для каждой строки ищем шаблон в столбце «Обращение». obr = df['Обращение'].apply(lambda x: re.search(r, str(x).lower())) #другой вариант: obr = df[' Обращение '].str.lower().str.contains(r) #Для каждой строки ищем шаблон в столбце «Решение». otvet = df['Решение'].apply(lambda x: re.search(r, str(x).lower())) #другой вариант: otvet = df['Решение'].str.lower().str.contains(r) #Для каждой строки проверяем наличие шаблона хотя бы в одном из столбцов «Обращение» и «Решение» (результат - True/False). itog = np.any(np.array([~obr.isnull(), ~otvet.isnull()]), axis=0) #Результат (оставляем только те строки в таблице, по которым получен результат True). new_df = df[itog] #Запись результата в excel. new_df.to_excel('Название итогового файла.xlsx', index=False)

В результате получаем новый файл excel, в который полностью скопированы нужные нам обращения клиентов:

- в обращении клиента с ИНН 1111111111 в столбцах «Обращение» и «Решение» содержится слово «КАСКО»;

- в обращении клиента с ИНН 333333333333 в столбце «Решение» содержатся сочетания слов «залог…транспорт», «транспорт…страх», «залог…авто», «страх…авто»;

- в обращении клиента с ИНН 444444444444 в столбце «Обращение» содержатся сочетания слов «страх…транспорт»; «транспорт…залог».

Количество столбцов, в которых можно производить поиск ключевых слов, не ограничен – в приведенном примере их два, но у вас может быть больше.

При необходимости для каждого столбца можно задать свой шаблон для поиска слов:

#Шаблон 1 для столбца «Обращение». r1= r'(каско)|(осаго)|(страх.*?транспорт)|(транспорт.*?страх)|(страх.*?авто)|(авто.*?страх)’ #Шаблон 2 для столбца «Решение». r2= r'(залог.*?транспорт)|(транспорт.*?залог)|(залог.*?авто)|(авто.*?залог)|(автострахов)' #Поиск шаблонов 1 и 2 в столбцах «Обращение» и «Решение» соответственно. obr = df['Обращение'].apply(lambda x: re.search(r1, str(x).lower())) otvet = df['Решение'].apply(lambda x: re.search(r2, str(x).lower()))

Если требуется выбрать строки, в которых ключевые слова содержатся и в том, и в другом столбце, то нужно заменить функцию any() на all():

itog = np.all(np.array([~obr.isnull(), ~otvet.isnull()]), axis=0)

Теперь рассмотрим ситуацию, когда у нас имеется несколько файлов excel с обращениями клиентов (с аналогичной структурой столбцов), и необходимо в каждом выбрать подходящие обращения.

Тогда код, с помощью которого мы отберем нужные строки, будет выглядеть так:

#Импорт библиотек. import pandas as pd import numpy as np import os import re import warnings #Игнорирование всех предупреждений. warnings.filterwarnings('ignore') #Путь к папке с исходными файлами. path = r'ПУТЬ К ПАПКЕ С ФАЙЛАМИ ' #Регулярные выражения. #Шаблон (слова/сочетания слов, которые необходимо найти в столбцах). r= r'(каско)|(осаго)|(страх.*?транспорт)|(транспорт.*?страх)|(страх.*?авто)|(авто.*?страх)|(залог.*?транспорт)|(транспорт.*?залог)|(залог.*?авто)|(авто.*?залог)|(автострахов)' #Создание папки, в которую будут сохраняться файлы с нужными обращениями. os.makedirs('Нужные обращения', exist_ok=True) #Получение списка полных имён для всех файлов xlsx в папке с исходными файлами. docs = [] for root, _, files in os.walk(path): for file in files: if file.split('.')[-1] == 'xlsx': docs.append(os.path.join(root, file)) print(f'В директории \nобнаружено файлов') #Для каждого файла из списка производим его чтение, поиск шаблона в столбцах «Обращение» и «Решение», проверяем наличие шаблона хотя бы в одном из данных столбцов, оставляем только те строки в таблице, по которым получен результат True, записываем результат в excel в папку «Нужные обращения». %%time for i, doc in enumerate(docs): df = pd.read_excel(doc) print(f' файл из прочитан', end=' ') obr = df['Обращение'].apply(lambda x: re.search(r, str(x).lower())) otvet = df['Решение'].apply(lambda x: re.search(r, str(x).lower())) itog = np.any(np.array([~obr.isnull(), ~otvet.isnull()]), axis=0) df = df[itog] df.to_excel(os.path.join('Нужные обращения', doc.split('\\')[-1]), index=False) print('и обработан')

В результате создается папка «Нужные обращения», в которой содержатся новые файлы excel с полностью скопированными нужными обращениями клиентов. По количеству и названию данные файлы соответствуют исходным.

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

Поиск по .txt файлу python?

Есть .txt файл такого формата
Name0 : 84555321599
Name1 : 84537905716
Name2 : 82497315780
Name3 : 84567822347

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

  • Вопрос задан более трёх лет назад
  • 2088 просмотров

Комментировать
Решения вопроса 2

hottabxp

Сергей Карбивничий @hottabxp Куратор тега Python
Сначала мы жили бедно, а потом нас обокрали..

Как наиболее оптимизированно это реализовать?

С помощью Базы Данных. Если взять Sqlite3, то можно уложиться в 15-30 строк кода.
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать

resolut1123

Алексей @resolut1123
Сам такое искал, вот что нашел:

str = input() sub_string = str with open("/name.txt") as file: lines = file.readlines() for line in lines: if sub_string in line: print(line)

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

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ответы на вопрос 1

Если файл не большой, то можно распарсить его в словарь, потом провести все действия и обратно записать в файл

my_dict = <> with open('file.txt') as file: for line in file.readlines(): name, value = line.split(':') my_dict[name.strip()] = value.strip() # code with open('file.txt', 'w') as file: file.writelines([f' : \n' for name, value in my_dict.items()])

Но это конечно костыли.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

python

  • Python
  • +1 ещё

Почему не работает кнопка «Переводчик» в тг боте (Telebot, python)?

  • 1 подписчик
  • 19 минут назад
  • 20 просмотров

Как в файле найти нужное слово python

Рассмотрим основные методы строк, которые мы можем применить в приложениях:

  • isalpha() : возвращает True, если строка состоит только из алфавитных символов
  • islower() : возвращает True, если строка состоит только из символов в нижнем регистре
  • isupper() : возвращает True, если все символы строки в верхнем регистре
  • isdigit() : возвращает True, если все символы строки - цифры
  • isnumeric() : возвращает True, если строка представляет собой число
  • startswith(str) : возвращает True, если строка начинается с подстроки str
  • endswith(str) : возвращает True, если строка заканчивается на подстроку str
  • lower() : переводит строку в нижний регистр
  • upper() : переводит строку в вехний регистр
  • title() : начальные символы всех слов в строке переводятся в верхний регистр
  • capitalize() : переводит в верхний регистр первую букву только самого первого слова строки
  • lstrip() : удаляет начальные пробелы из строки
  • rstrip() : удаляет конечные пробелы из строки
  • strip() : удаляет начальные и конечные пробелы из строки
  • ljust(width) : если длина строки меньше параметра width, то справа от строки добавляются пробелы, чтобы дополнить значение width, а сама строка выравнивается по левому краю
  • rjust(width) : если длина строки меньше параметра width, то слева от строки добавляются пробелы, чтобы дополнить значение width, а сама строка выравнивается по правому краю
  • center(width) : если длина строки меньше параметра width, то слева и справа от строки равномерно добавляются пробелы, чтобы дополнить значение width, а сама строка выравнивается по центру
  • find(str[, start [, end]) : возвращает индекс подстроки в строке. Если подстрока не найдена, возвращается число -1
  • replace(old, new[, num]) : заменяет в строке одну подстроку на другую
  • split([delimeter[, num]]) : разбивает строку на подстроки в зависимости от разделителя
  • partition(delimeter) : разбивает строку по разделителю на три подстроки и возвращает кортеж из трех элементов - подстрока до разделителя, разделитель и подстрока после разделителя
  • join(strs) : объединяет строки в одну строку, вставляя между ними определенный разделитель

Например, если мы ожидаем ввод с клавиатуры числа, то перед преобразованием введенной строки в число можно проверить, с помощью метода isnumeric() введено ли в действительности число, и если так, то выполнить операцию преобразования:

string = input("Введите число: ") if string.isnumeric(): number = int(string) print(number)

Проверка, начинается или оканчивается строка на определенную подстроку:

file_name = "hello.py" starts_with_hello = file_name.startswith("hello") # True ends_with_exe = file_name.endswith("exe") # False

Удаление пробелов в начале и в конце строки:

string = " hello world! " string = string.strip() print(string) # hello world!

Дополнение строки пробелами и выравнивание:

print("iPhone 7:", "52000".rjust(10)) print("Huawei P10:", "36000".rjust(10))
iPhone 7: 52000 Huawei P10: 36000

Поиск в строке

Для поиска подстроки в строке в Python применяется метод find() , который возвращает индекс первого вхождения подстроки в строку и имеет три формы:

  • find(str) : поиск подстроки str ведется с начала строки до ее конца
  • find(str, start) : параметр start задает начальный индекс, с которого будет производиться поиск
  • find(str, start, end) : параметр end задает конечный индекс, до которого будет идти поиск

Если подстрока не найдена, метод возвращает -1:

welcome = "Hello world! Goodbye world!" index = welcome.find("wor") print(index) # 6 # поиск с 10-го индекса index = welcome.find("wor",10) print(index) # 21 # поиск с 10 по 15 индекс index = welcome.find("wor",10,15) print(index) # -1

Замена в строке

Для замены в строке одной подстроки на другую применяется метод replace() :

  • replace(old, new) : заменяет подстроку old на new
  • replace(old, new, num) : параметр num указывает, сколько вхождений подстроки old надо заменить на new. По умолчанию num равно -1, что соответствует первой версии метода и приводит к замене всех вхождений.
phone = "+1-234-567-89-10" # замена дефисов на пробел edited_phone = phone.replace("-", " ") print(edited_phone) # +1 234 567 89 10 # удаление дефисов edited_phone = phone.replace("-", "") print(edited_phone) # +12345678910 # замена только первого дефиса edited_phone = phone.replace("-", "", 1) print(edited_phone) # +1234-567-89-10

Разделение на подстроки

Метод split() разбивает строку на список подстрок в зависимости от разделителя. В качестве разделителя может выступать любой символ или последовательность символов. Данный метод имеет следующие формы:

  • split() : в качестве разделителя используется пробел
  • split(delimeter) : в качестве разделителя используется delimeter
  • split(delimeter, num) : параметр num указывает, сколько вхождений delimeter используется для разделения. Оставшаяся часть строки добавляется в список без разделения на подстроки
text = "Это был огромный, в два обхвата дуб, с обломанными ветвями и с обломанной корой" # разделение по пробелам splitted_text = text.split() print(splitted_text) print(splitted_text[6]) # дуб, # разбиение по запятым splitted_text = text.split(",") print(splitted_text) print(splitted_text[1]) # в два обхвата дуб # разбиение по первым пяти пробелам splitted_text = text.split(" ", 5) print(splitted_text) print(splitted_text[5]) # обхвата дуб, с обломанными ветвями и с обломанной корой

Еще один метод - partition() разбивает строку по разделителю на три подстроки и возвращает кортеж из трех элементов - подстрока до разделителя, разделитель и подстрока после разделителя:

text = "Это был огромный, в два обхвата дуб, с обломанными ветвями и с обломанной корой" text_parts = text.partition("дуб") print(text_parts) # ('Это был огромный, в два обхвата ', 'дуб', ', с обломанными ветвями и с обломанной корой')

Если разделитель с строке не найден, то возвращается кортеж с одной строкой.

Соединение строк

При рассмотрении простейших операций со строками было показано, как объединять строки с помощью операции сложения. Другую возможность для соединения строк представляет метод join() : он объединяет список строк. Причем текущая строка, у которой вызывается данный метод, используется в качестве разделителя:

words = ["Let", "me", "speak", "from", "my", "heart", "in", "English"] # разделитель - пробел sentence = " ".join(words) print(sentence) # Let me speak from my heart in English # разделитель - вертикальная черта sentence = " | ".join(words) print(sentence) # Let | me | speak | from | my | heart | in | English

Вместо списка в метод join можно передать простую строку, тогда разделитель будет вставляться между символами этой строки:

word = "hello" joined_word = "|".join(word) print(joined_word) # h|e|l|l|o

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

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