Ниже описана минимальная теория, которая может пригодиться во время выполнения лабораторной. Более подробную информацию смотрите в лекциях по курсу и в разделе "полезные ссылки".
Для чтения из файла необходимо открыть файловый поток, вызвав функцию open():
file = open("file_name.txt", "r")"file_name.txt" - путь к файлу;
"r" - режим чтения файла (read);
file - переменная файлового потока.
Считать информацию из файла можно, использовав один из следующих методов файлового потока:
-
readline()- считывает одну строку из файла -
read()- считывает все содержимое файла в одну строку -
readlines()- считывает все строки файла в список
После чтения файловый поток необходимо закрыть с помощью метода close():
file.close()Однако, более оптимальным вариантом будет использование конструкции with, которая автоматически закроет файловый поток:
with open("my_file.txt", "r") as file:
text = file.read()Для передачи аргументов черезз командную строку используется встроенный модуль argparse:
import argparseПример использования:
import argparse
parser = argparse.ArgumentParser() # создание экземпляра парсера
parser.add_argument('name', type=str, help='your name') # добавление позиционного аргумента командной строки
args = parser.parse_args() # парсинг аргументов
print(f"Hello, {args.name}!") # использование полученного значения аргумента'name' - название аргумента (обязательный параметр)
type - тип данных аргумента (необязательный параметр)
help - подсказка для аргумента (необязательный параметр)
Запуск программы:
python my_program.py Ivan
Hello, Ivan!
Аргументов командной строки может быть любое количество, они могут быть позиционные (обязательные) и необязательные. Необязательный аргумент добавляется следующим образом:
parser.add_argument("-s", "--surname", type=str, help="your surname")"--surname" - полное название аргумента (обязательный параметр)
"-s" - сокращённое название (необязательный параметр)
В командной строке для добавления необязательного аргумента необходимо указать либо полное, либо сокращённое название:
my_program.py Ivan -s Ivanov
или
my_program.py Ivan -surname Ivanov
Также перед использованием необходимо проверять, существует ли такой аргумент:
if args.surname is not None: # проверка на существование значения
print(f"Hello, {args.name} {args.surname}!")
else:
print(f"Hello, {args.name}!")Регулярные выражения в Python используются для поиска, обработки и манипуляции строками, соответствующими заданным шаблонам. Шаблоном для регулярных выражений может считаться любая строка - в этом случае будет выполнен обычный поиск по подстроке. Если же мы хотим создать более сложный шаблон, то необходимо использовать спецсимволы.
.- Один любой символ, кроме новой строки\n.\d- Любая цифра\s- Любой пробельный символ (пробел, табуляция, конец строки и т.п.)\w- Любая буква (то, что может быть частью слова), а также цифры и_[..]- Один из символов в скобках, а также любой символ из диапазонаa-b[^..]- Любой символ, кроме перечисленных
{n}- Ровно n повторений{m,n}- От m до n повторений включительно{m,}- Не менее m повторений{,n}- Не более n повторений?- Ноль или одно вхождение, синоним {0,1}*- Ноль или более, синоним {0,}+- Одно или более, синоним {1,}
Библиотека re в Python предоставляет функции для работы с регулярными выражениями.
re.search(pattern, string) - Найти в строке string первую строчку, подходящую под шаблон pattern;
re.fullmatch(pattern, string) - Проверить, подходит ли строка string под шаблон pattern;
re.split(pattern, string, maxsplit=0) - Аналог str.split(), только разделение происходит по подстрокам, подходящим под шаблон pattern;
re.findall(pattern, string) - Найти в строке string все непересекающиеся шаблоны pattern;
re.finditer(pattern, string) - Итератор по всем непересекающимся шаблонам pattern в строке string (выдаются match-объекты);
re.sub(pattern, repl, string, count=0) - Заменить в строке string все непересекающиеся шаблоны pattern на repl;
Пример поиска по шаблону:
import re
text = "Список чисел: 123, 456, 789 и 123" # строка поиска
pattern = r'\d+' # шаблон
numbers = re.findall(number_pattern, text)
print(numbers)Результат:
['123', '456', '789', '123']
Пример разделения строки по шаблону:
import re
text = "один, два, три; четыре. пять! шесть" # строка поиска
# Разделяем строку по разделителям: точка с запятой, запятая, точка, восклицательный знак, пробельный символ
parts = re.split(r'[;,.!\s]+', text)
print(parts)Результат:
['один', 'два', 'три', 'четыре', 'пять', 'шесть']
Открыть и прочитать файл. Название файла вводится через аргументы командной строки. Воспользовавшись регулярными выражениями, выполнить задание согласно варианту. Вывести на экран результат.
В файле data.txt дан список анкет людей со следующей структурой:
- Фамилия
- Имя
- Пол
- Дата рождения
- Номер телефона или email
- Город
Валидные форматы для каждого пункта:
- Фамилия и имя:
- Начинаются с заглавной буквы
- Пол:
- М, м, Мужской, мужской, Ж, ж, Женский, женский
- Дата рождения:
- Форматы:
- 01/01/2000
- 01-01-2000
- 01.01.2000
- 1/1/2000
- 1-1-2000
- 1.1.2000
- Должен быть корректный диапазон дней и месяцев, год - от 1900 до текущего.
- Форматы:
- Номер телефона или email:
- Номер телефона:
- 11 цифр
- Начинается с 8 или +7
- Формат:
- 8 (012) 345-67-89
- 80123456789
- 8 012 345-67-89
- 8 (012) 345 67 89
- 8 012 345 67 89
- email:
- Домены: gmail.com, mail.ru, yandex.ru
- Локальная часть (название):
- Буквы (A-Z, a-z)
- Цифры (0-9)
- Символы: . _ % + -
- Длина: до 64 символов
- Номер телефона:
- Город:
- Формат: Москва, г. Москва
- Посчитайте количество анкет мужчин в списке. Выведите их количество на экран и сохраните анкеты в новый файл.
- Посчитайте количество людей, родившихся в 21 веке. Выведите их количество на экран и сохраните анкеты в новый файл.
- Посчитайте количество людей возрастом от 30 до 40 лет. Выведите их количество на экран и сохраните анкеты в новый файл.
- Найдите самого старого и самого молодого человека. Выведите их возраст и анкеты на экран.
- Найдите всех людей с фамилией Иванов(а). Выведите их количество на экран и сохраните анкеты в новый файл.
- Найти всех людей с фамилиями, оканчивающимися на "ов(а)". Выведите их количество на экран и сохраните анкеты в новый файл.
- Найдите всех людей, чьи телефоны имеют код города 927. Выведите их количество на экран и сохраните их анкеты в новый файл.
- Найдите всех людей, проживающих в городе Москва. Выведите их количество на экран и сохраните их анкеты в новый файл.
- Посчитайте, какое имя встречается чаще всего. Выведите имя и количество повторений на экран.
- Найдите все женские имена, начинающиеся с буквы А. Выведите их количество на экран и сохраните анкеты в новый файл.
- Пользователь вводит имя человека. Подсчитайте количество людей с таким именем. Выведите их количество на экран и сохраните анкеты в новый файл.
- Определите, какой код оператора среди телефонных номеров встречается чаще всего. Выведите код и количество его повторений на экран.
- Найдите анкеты людей, у которых указан номер телефона (в корректном формате). Выведите их количество на экран и сохраните найденные анкеты в новый файл.
- Найдите анкеты людей, у которых указана почта (в корректном формате). Выведите их количество на экран и сохраните найденные анкеты в новый файл.
- Проверьте, что номера телефонов уникальны. Анкеты с дубликатами выведите на экран.
- Проверьте, что адреса почты уникальны. Анкеты с дубликатами выведите на экран.
- Проверьте, что все имена и фамилии начинаются с заглавной буквы. Если имя или фамилия начинаются со строчной буквы - исправьте это и сохраните результат в новый файл.
- Найдите номера телефонов с некорректным форматом. Выведите найденные анкеты на экран. Удалите найденные анкеты и сохраните результат в новый файл.
- Найдите адреса почты с некорректным форматом. Выведите найденные анкеты на экран. Удалите найденные анкеты и сохраните результат в новый файл.
- Найдите даты рождения с некорректным форматом. Выведите найденные анкеты на экран. Удалите найденные анкеты и сохраните результат в новый файл.
- Составьте список фамилий и имён в формате "Фамилия И.". Отсортируйте получившийся список в алфавитном порядке и сохраните в новый файл. Все имена и фамилии должны иметь корректный формат.
- Создайте список в формате "Фамилия: номер телефона" и сохраните его в новый файл. Все номера должны иметь корректный формат.
- Создайте список в формате "Фамилия: адрес почты" и сохраните его в новый файл. Все адреса должны иметь корректный формат.
- Создайте список в формате "Фамилия: дата рождения". Отсортируйте его по возрасту и сохраните в новый файл. Все даты рождения должны иметь корректный формат.
- Отсортируйте исходный список по фамилиям и именам в алфавитном порядке и сохраните результат в новый файл (структура списка не меняется).
- Приведите все данные к единому шаблону (любому из допустимых). Сохраните результат в новый файл. Если данные указаны некорректно - поставьте прочерк.
- Посчтиайте статистику по доменам адресов почты: создайте список в формате "Домен: количество", отсортируйте его по количеству людей и сохраните в новый файл.
- Посчитайте статистику по городам: посчитайте количиство людей из каждого города, создайте список в формате "Город: количество", отсортируйте его по количеству людей и алфавитному порядку и сохраните в новый файл.
- Посчитайте статистику по возрасту: создайте два списка - для мужчин и женщин, в формате "Диапазон - количество" и сохраните его в новый файл. Диапазоны для мужчин: 0-17, 18-64, 65+, для женщин: 0-17, 18-59, 60+.
- Схораните данные в виде таблицы в формате csv. Таблица должна содержать колонки: Фамилия, Имя, Пол, Дата рождения, Номер телефона (прочерк если нет), Почта (прочерк, если нет), Город. Если данные в колонке некорректны - поставьте прочерк.