Форматы JSON и CSV в Python: чтение, запись и анализ данных
Мы уже рассмотрели основы работы с файлами и текстовыми файлами в Python. Теперь мы переходим к структурированным данным — форматам, которые используются для хранения и обмена данными в структурированном виде. 🧩
Мы сосредоточимся на двух наиболее популярных форматах:
- JSON (JavaScript Object Notation) — формат для обмена данными, широко используемый в веб-приложениях и API
- CSV (Comma-Separated Values) — простой формат для представления табличных данных
Эти форматы очень распространены и используются во всех областях программирования — от веб-разработки до анализа данных.
JSON: JavaScript Object Notation
JSON (JavaScript Object Notation) — это текстовый формат обмена данными, похожий на словари и списки в Python. Он легко читается как человеком, так и машиной.
Структура данных JSON
JSON поддерживает следующие типы данных:
- Объекты (словари): {"name": "Alice", "age": 30}
- Массивы (списки): [1, 2, 3, 4]
- Строки: "Hello, world!"
- Числа: 42, 3.14
- Логические значения: true, false
- null (в Python соответствует None)
Модуль json в Python
Python предоставляет встроенный модуль json для работы с этим форматом:
>>> import json # Простой словарь Python >>> person = { ... "name": "Анна", ... "age": 28, ... "city": "Москва", ... "languages": ["Python", "JavaScript"] ... } # Преобразование словаря Python в строку JSON >>> json_string = json.dumps(person, ensure_ascii=False, indent=2) >>> print("JSON строка:") >>> print(json_string)
JSON строка:{"name": "Анна","age": 28,"city": "Москва","languages": ["Python","JavaScript"]}# Преобразование строки JSON обратно в объект Python >>> parsed_data = json.loads(json_string) >>> print("\nПреобразовано обратно в Python:") >>> print(f"Имя: {parsed_data['name']}") >>> print(f"Возраст: {parsed_data['age']}") >>> print(f"Языки программирования: {', '.join(parsed_data['languages'])}")Преобразовано обратно в Python:Имя: АннаВозраст: 28Языки программирования: Python, JavaScript
Запись JSON в файл и чтение из файла
Вот как можно сохранить данные в JSON-файл и затем прочитать их:
>>> import json # Данные о студентах >>> students = [ ... {"id": 1, "name": "Иван", "scores": [85, 90, 78]}, ... {"id": 2, "name": "Мария", "scores": [92, 88, 95]} ... ] # Запись в файл >>> with open('students.json', 'w', encoding='utf-8') as file: ... json.dump(students, file, ensure_ascii=False, indent=2) ... print("Данные записаны в файл students.json")
Данные записаны в файл students.json# Чтение из файла >>> with open('students.json', 'r', encoding='utf-8') as file: ... loaded_students = json.load(file) ... print(f"\nЗагружено {len(loaded_students)} студентов:") >>> for student in loaded_students: ... avg_score = sum(student['scores']) / len(student['scores']) ... print(f" {student['name']}: средний балл {avg_score:.1f}")Загружено 2 студентов:Иван: средний балл 84.3Мария: средний балл 91.7
Основные методы модуля json
Параметр ensure_ascii=False позволяет корректно сохранять русские буквы и другие символы Unicode, а indent делает вывод более читаемым.
CSV: Comma-Separated Values
CSV (Comma-Separated Values) — это простой текстовый формат для представления табличных данных, где строки таблицы — это строки файла, а столбцы разделены запятыми (или другими разделителями).
CSV выглядит примерно так:
Имя,Возраст,Город Анна,28,Москва Иван,35,Санкт-Петербург
Модуль csv в Python
Python предоставляет встроенный модуль csv для работы с этим форматом:
>>> import csv # Данные для записи >>> data = [ ... ['Имя', 'Возраст', 'Город'], # Заголовки ... ['Анна', '28', 'Москва'], ... ['Иван', '35', 'Санкт-Петербург'], ... ['Мария', '22', 'Казань'] ... ] # Запись в CSV файл >>> with open('people.csv', 'w', newline='', encoding='utf-8') as file: ... writer = csv.writer(file) ... writer.writerows(data) ... print("Данные записаны в файл people.csv")
Данные записаны в файл people.csv# Чтение из CSV файла >>> with open('people.csv', 'r', encoding='utf-8') as file: ... reader = csv.reader(file) >>> # Чтение заголовков (первая строка) ... headers = next(reader) ... print(f"\nЗаголовки: {headers}") >>> # Чтение данных ... print("\nДанные:") ... for row in reader: ... print(f" {row[0]}, {row[1]} лет, город {row[2]}")Заголовки: ['Имя', 'Возраст', 'Город']Данные:Анна, 28 лет, город МоскваИван, 35 лет, город Санкт-ПетербургМария, 22 лет, город Казань
Использование DictReader и DictWriter
Для более удобной работы с CSV можно использовать DictReader и DictWriter, которые позволяют работать с данными как со словарями:
>>> import csv # Запись в CSV с использованием DictWriter >>> data = [ ... {'Имя': 'Алексей', 'Профессия': 'Инженер', 'Зарплата': 85000}, ... {'Имя': 'Екатерина', 'Профессия': 'Дизайнер', 'Зарплата': 75000}, ... {'Имя': 'Сергей', 'Профессия': 'Программист', 'Зарплата': 110000} ... ] >>> with open('employees.csv', 'w', newline='', encoding='utf-8') as file: ... fieldnames = ['Имя', 'Профессия', 'Зарплата'] ... writer = csv.DictWriter(file, fieldnames=fieldnames) >>> writer.writeheader() # Запись заголовков ... writer.writerows(data) # Запись данных ... print("Данные сотрудников записаны в файл")
Данные сотрудников записаны в файл# Чтение из CSV с использованием DictReader >>> with open('employees.csv', 'r', encoding='utf-8') as file: ... reader = csv.DictReader(file) >>> print("\nСотрудники:") ... for row in reader: ... print(f" {row['Имя']} - {row['Профессия']}, зарплата: {row['Зарплата']} руб.")Сотрудники:Алексей - Инженер, зарплата: 85000 руб.Екатерина - Дизайнер, зарплата: 75000 руб.Сергей - Программист, зарплата: 110000 руб.
Основные особенности работы с CSV
- Разделители: Хотя CSV расшифровывается как "значения, разделённые запятыми", на практике могут использоваться и другие разделители (точка с запятой, табуляция)
- Кавычки: Если значение содержит разделитель или кавычки, оно заключается в кавычки
- Экранирование: Если внутри значения есть кавычки, они экранируются
>>> import csv # Пример с другим разделителем >>> data = [ ... ['Товар', 'Цена', 'Наличие'], ... ['Ноутбук', '45000', 'Да'], ... ['Смартфон', '25000', 'Нет'] ... ] # Запись с использованием точки с запятой >>> with open('products.csv', 'w', newline='', encoding='utf-8') as file: ... writer = csv.writer(file, delimiter=';') ... writer.writerows(data) ... print("Данные записаны с разделителем ';'")
Данные записаны с разделителем ';'# Чтение с указанием правильного разделителя >>> with open('products.csv', 'r', encoding='utf-8') as file: ... reader = csv.reader(file, delimiter=';') ... for row in reader: ... print(' '.join(row))Товар Цена НаличиеНоутбук 45000 ДаСмартфон 25000 Нет
Практический пример: Анализ данных о продажах
Рассмотрим пример, где мы сначала сохраняем данные о продажах в CSV, а затем анализируем их и сохраняем результаты в JSON:
>>> import csv >>> import json # Создаем данные о продажах >>> sales = [ ... ['Дата', 'Товар', 'Категория', 'Цена', 'Количество'], ... ['2023-01-05', 'Ноутбук HP', 'Электроника', '45000', '2'], ... ['2023-01-10', 'Смартфон Apple', 'Электроника', '85000', '3'], ... ['2023-01-15', 'Книга "Python"', 'Книги', '1200', '5'], ... ['2023-02-10', 'Микроволновка', 'Бытовая техника', '7000', '1'] ... ] # Шаг 1: Сохраняем данные в CSV >>> with open('sales.csv', 'w', newline='', encoding='utf-8') as file: ... writer = csv.writer(file) ... writer.writerows(sales) ... print("Данные о продажах сохранены в CSV")
Данные о продажах сохранены в CSV# Шаг 2: Читаем и анализируем данные >>> with open('sales.csv', 'r', encoding='utf-8') as file: ... reader = csv.reader(file) ... headers = next(reader) # Пропускаем заголовки >>> # Подготовка переменных для анализа ... total_revenue = 0 ... sales_by_category = {} >>> # Анализ данных ... for row in reader: ... date, product, category, price, quantity = row ... revenue = float(price) * int(quantity) >>> # Общая выручка ... total_revenue += revenue >>> # Выручка по категориям ... if category in sales_by_category: ... sales_by_category[category] += revenue ... else: ... sales_by_category[category] = revenue >>> # Вывод результатов анализа ... print(f"\nОбщая выручка: {total_revenue} руб.") ... print("\nВыручка по категориям:") ... for category, rev in sales_by_category.items(): ... print(f" {category}: {rev} руб.")Общая выручка: 354000.0 руб.Выручка по категориям:Электроника: 345000.0 руб.Книги: 6000.0 руб.Бытовая техника: 7000.0 руб.# Шаг 3: Сохраняем результаты анализа в JSON >>> results = { ... "total_revenue": total_revenue, ... "sales_by_category": sales_by_category ... } >>> with open('sales_analysis.json', 'w', encoding='utf-8') as file: ... json.dump(results, file, ensure_ascii=False, indent=2) ... print("\nРезультаты анализа сохранены в JSON")Результаты анализа сохранены в JSON# Шаг 4: Проверяем сохраненный JSON >>> with open('sales_analysis.json', 'r', encoding='utf-8') as file: ... saved_results = json.load(file) ... print("\nСодержимое JSON файла с результатами:") ... print(json.dumps(saved_results, ensure_ascii=False, indent=2))Содержимое JSON файла с результатами:{"total_revenue": 354000.0,"sales_by_category": {"Электроника": 345000.0,"Книги": 6000.0,"Бытовая техника": 7000.0}}
В этом примере мы:
- Создали CSV-файл с данными о продажах
- Прочитали данные и рассчитали выручку по категориям
- Сохранили результаты анализа в JSON-файл
- Прочитали сохраненный JSON, чтобы убедиться в корректности
Проверка понимания
Какой код правильно считывает данные из JSON файла в Python?