/
Nick_Wern
/
SUSU
Обзор
Документация
Войти
/
Nick_Wern
/
SUSU
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Python/Lesson11/Lesson11_41.py
213 строк
9 KB
Nick_Wern
Добавлены работы по дисциплине Программирование на Python
03 май 2026, 19:26
03 май 2026, 19:26
913d1bd
Код
Авторство
О чём код?
import csv import os from typing import List, Dict def filter_adults(csv_path: str, output_path: str) -> None: # if not os.path.exists(csv_path): # raise FileNotFoundError(f"Файл {csv_path} не найден") try: with open(csv_path, 'r', encoding='utf-8') as input_file: reader = csv.DictReader(input_file) fieldnames = reader.fieldnames if fieldnames is None: raise ValueError("CSV файл не содержит заголовка") if 'age' not in fieldnames: raise ValueError("CSV файл должен содержать поле 'age'") # Собираем все строки и фильтруем совершеннолетних adults = [] total_rows = 0 skipped_rows = 0 for row in reader: total_rows += 1 try: # Преобразуем возраст в число age = int(row['age'].strip()) # Проверяем, совершеннолетний ли человек if age >= 18: adults.append(row) else: skipped_rows += 1 except (ValueError, KeyError) as e: # Пропускаем строки с некорректным возрастом print(f"Предупреждение: пропущена строка {total_rows} - " f"некорректный возраст: {row.get('age', 'N/A')}") skipped_rows += 1 continue except UnicodeDecodeError: # Пробуем другие кодировки, если utf-8 не сработала with open(csv_path, 'r', encoding='cp1251') as input_file: reader = csv.DictReader(input_file) fieldnames = reader.fieldnames if fieldnames is None: raise ValueError("CSV файл не содержит заголовка") if 'age' not in fieldnames: raise ValueError("CSV файл должен содержать поле 'age'") adults = [] total_rows = 0 skipped_rows = 0 for row in reader: total_rows += 1 try: age = int(row['age'].strip()) if age >= 18: adults.append(row) else: skipped_rows += 1 except (ValueError, KeyError): print(f"Предупреждение: пропущена строка {total_rows} - " f"некорректный возраст: {row.get('age', 'N/A')}") skipped_rows += 1 continue # Записываем отфильтрованные данные в новый CSV файл with open(output_path, 'w', encoding='utf-8', newline='') as output_file: writer = csv.DictWriter(output_file, fieldnames=fieldnames) # Записываем заголовок writer.writeheader() # Записываем данные for adult in adults: writer.writerow(adult) # Выводим статистику print(f"Обработка завершена:") print(f" Всего строк в исходном файле: {total_rows}") print(f" Сохранено совершеннолетних: {len(adults)}") print(f" Отфильтровано несовершеннолетних: {skipped_rows}") print(f" Результат сохранен в: {output_path}") def create_sample_csv(file_path: str = "people.csv") -> None: """ Создает пример CSV файла для тестирования. Args: file_path (str): Путь для сохранения тестового файла """ sample_data = [ {"name": "Иван Иванов", "age": "25", "city": "Москва"}, {"name": "Мария Петрова", "age": "17", "city": "Санкт-Петербург"}, {"name": "Алексей Смирнов", "age": "30", "city": "Казань"}, {"name": "Елена Козлова", "age": "16", "city": "Екатеринбург"}, {"name": "Дмитрий Новиков", "age": "22", "city": "Новосибирск"}, {"name": "Анна Морозова", "age": "45", "city": "Владивосток"}, {"name": "Сергей Волков", "age": "15", "city": "Краснодар"}, {"name": "Ольга Соколова", "age": "28", "city": "Ростов-на-Дону"}, {"name": "Павел Лебедев", "age": "19", "city": "Уфа"}, {"name": "Татьяна Орлова", "age": "33", "city": "Волгоград"}, {"name": "invalid_age", "age": "не число", "city": "Тестовый"}, {"name": "empty_age", "age": "", "city": "Тестовый2"} ] with open(file_path, 'w', encoding='utf-8', newline='') as f: writer = csv.DictWriter(f, fieldnames=["name", "age", "city"]) writer.writeheader() writer.writerows(sample_data) print(f"Создан тестовый файл: {file_path}") def display_csv(file_path: str) -> None: """ Выводит содержимое CSV файла на экран. Args: file_path (str): Путь к CSV файлу """ if not os.path.exists(file_path): print(f"Файл {file_path} не найден") return print(f"\nСодержимое файла {file_path}:") print("=" * 50) with open(file_path, 'r', encoding='utf-8') as f: reader = csv.reader(f) for i, row in enumerate(reader): if i == 0: print(f"Заголовок: {', '.join(row)}") else: print(f"Строка {i}: {', '.join(row)}") print("=" * 50) def main(): """Пример использования функции фильтрации""" print("Фильтрация CSV по возрасту") print("=" * 50) # Создаем тестовый файл, если его нет input_file = "people.csv" output_file = "adults.csv" if not os.path.exists(input_file): print("Создаю тестовый файл...") create_sample_csv(input_file) # Показываем исходный файл display_csv(input_file) try: # Выполняем фильтрацию print("\nВыполняю фильтрацию...") filter_adults(input_file, output_file) # Показываем результат display_csv(output_file) except Exception as e: print(f"Произошла ошибка: {e}") def test_filter_adults(): """Тестирование функции фильтрации с разными сценариями""" print("\nТестирование функции filter_adults()") print("-" * 30) # Тест 1: Нормальный случай print("Тест 1: Нормальный файл") create_sample_csv("test_people.csv") filter_adults("test_people.csv", "test_adults.csv") # Тест 2: Файл не существует print("\nТест 2: Файл не существует") try: filter_adults("nonexistent.csv", "output.csv") except FileNotFoundError as e: print(f"Ожидаемая ошибка: {e}") # Тест 3: Файл без поля age print("\nТест 3: Файл без поля age") with open("no_age.csv", 'w', encoding='utf-8', newline='') as f: writer = csv.writer(f) writer.writerow(["name", "city"]) # Нет поля age writer.writerow(["Иван", "Москва"]) try: filter_adults("no_age.csv", "output.csv") except ValueError as e: print(f"Ожидаемая ошибка: {e}") # Очистка тестовых файлов for file in ["test_people.csv", "test_adults.csv", "no_age.csv"]: if os.path.exists(file): os.remove(file) print(f"Удален тестовый файл: {file}") if __name__ == "__main__": main() # Раскомментируйте для запуска тестов: # test_filter_adults()