Извлечение данных из JSON-файлов средствами Python: от простого к сложному

Раздел: Ввод-вывод и файловая система -> Файловый ввод-вывод

Основные способы чтения JSON из файла в Python

Работа с JSON в Python начинается с модуля json. Стандартная библиотека предоставляет функцию json.load(), которая десериализует JSON из открытого файлового объекта. Ниже рассматриваются различные подходы, их цели и типичные трудности.

Базовое решение с json.load()

Как прочитать и преобразовать JSON-файл в объект Python?

Для простого чтения всего JSON-файла достаточно открыть его в режиме чтения с указанием кодировки (обычно utf-8) и передать файловый объект в json.load(). Результатом становится словарь, список или другой тип данных в зависимости от содержимого.

import json

with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)
print(type(data))  #  или 

ввод программ на python (ввод данных в программе python)

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

Типичные ошибки:

  • FileNotFoundError – если файл не существует. Проверяйте путь через os.path.exists() или используйте блок try-except.
  • JSONDecodeError – если файл содержит синтаксические ошибки или пустой. Используйте валидацию перед обработкой.
  • Проблемы с кодировкой – всегда явно указывайте encoding='utf-8' при открытии.

Альтернативные способы чтения JSON

Чтение JSON из строки (не из файла)

Как десериализовать JSON, если данные уже находятся в переменной-строке?

Для этого используется функция json.loads(). Она принимает строку с JSON и возвращает объект Python. Полезна при получении данных по сети или из других источников, возвращающих строку.

import json

json_string = '{"name": "Alice", "age": 30}'
data = json.loads(json_string)
print(data['name'])  # Alice

Python file io (ввод-вывод файлов в python)

Ошибка: если строка невалидна, возникнет JSONDecodeError. Можно использовать json.loads(json_string, strict=False) для ослабления проверок, но это не рекомендуется.

Загрузка JSON из URL (веб-API)

Как получить и распарсить JSON с удалённого сервера?

С помощью модуля urllib.request или сторонней библиотеки requests. Полученную строку передают в json.loads().

import json
import urllib.request

url = 'https://api.example.com/data.json'
with urllib.request.urlopen(url) as response:
    raw_data = response.read().decode('utf-8')
    data = json.loads(raw_data)
print(type(data))

Python temp files (временные файлы в python)

С библиотекой requests есть встроенный метод .json(), который уже преобразует ответ.

Чтение JSON с помощью библиотеки Pandas

Как загрузить JSON-файл непосредственно в DataFrame для анализа данных?

Функция pandas.read_json() позволяет прочитать JSON разных форматов (ориентированный на записи, столбцы, индексы). Это удобно, если данные структурированы как таблица.

import pandas as pd

df = pd.read_json('data.json')
print(df.head())

Python index files (индексация файлов в python)

При этом внутренне используется json.load с последующим преобразованием. Обратите внимание: для вложенных структур может потребоваться параметр orient.

Проблема: Pandas ожидает определённую структуру. Нестандартные JSON (например, вложенные словари) могут быть интерпретированы неверно. Рекомендуется предварительно изучить документацию Pandas по read_json.

Потоковое чтение больших JSON-файлов (iJSON)

Как обработать гигабайтный JSON без загрузки всего файла в память?

Библиотека ijson позволяет парсить JSON по частям, извлекая нужные элементы. Это полезно для логов, бекапов или дампов баз данных.

import ijson

with open('large_data.json', 'r', encoding='utf-8') as f:
    parser = ijson.parse(f)
    for prefix, event, value in parser:
        if event == 'map_key' and prefix == 'item':
            print('Ключ:', value)

Метод ijson.items() может извлекать конкретные элементы по пути.

Сложность: необходимо знать структуру JSON заранее. Библиотека менее популярна, чем json, и может иметь особенности с разными версиями Python.

При выборе способа чтения JSON важно учитывать размер данных, источник и требуемую структуру на выходе. Для небольших файлов оптимально использовать json.load() с обработкой исключений.

- Python config files (конфигурационные файлы в python)
- Python copy file (копирование файла в python)
- Python log file (логирование в файл в python)

Расширенные примеры работы с JSON в Python

Приведённые ниже примеры демонстрируют более сложные сценарии, которые встречаются в реальных проектах.

Пример 1. Чтение вложенного JSON с обработкой ошибок

Файл nested.json содержит вложенные объекты. Необходимо извлечь значение по пути user.address.city, но путь может отсутствовать.

Пример
import json

with open('nested.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

try:
    city = data['user']['address']['city']
except KeyError:
    city = 'не указан'
print('Город:', city)
Город: Москва

Можно использовать метод .get() для безопасного доступа:

Пример
city = data.get('user', {}).get('address', {}).get('city', 'не указан')

Пример 2. Преобразование типов при загрузке JSON

Иногда требуется преобразовать строки в объекты datetime. Стандартный json.load не делает этого автоматически. Используйте пользовательский декодер.

Пример
import json
from datetime import datetime

def custom_decoder(obj):
    if '__datetime__' in obj:
        return datetime.fromisoformat(obj['value'])
    return obj

with open('dates.json', 'r', encoding='utf-8') as f:
    data = json.load(f, object_hook=custom_decoder)

print(data['timestamp'])

При этом JSON должен содержать специальный маркер, например {"__datetime__": true, "value": "2025-03-23T12:00:00"}.

Пример 3. Чтение JSON из нескольких файлов с объединением

Допустим, есть несколько JSON-файлов с данными пользователей. Нужно загрузить их все и объединить в один список.

Пример
import json
import glob

all_users = []
for filepath in glob.glob('users_*.json'):
    with open(filepath, 'r', encoding='utf-8') as f:
        data = json.load(f)
        if isinstance(data, list):
            all_users.extend(data)
        else:
            all_users.append(data)

print(f'Загружено {len(all_users)} пользователей')
Загружено 150 пользователей

Пример 4. Чтение JSON из URL с аутентификацией (библиотека requests)

Для доступа к защищённым API используется сессия с токеном.

Пример
import requests
import json

session = requests.Session()
session.headers.update({'Authorization': 'Bearer your_token_here'})
response = session.get('https://api.example.com/secure_data.json')
response.raise_for_status()  # Проверка на ошибки HTTP
data = response.json()  # встроенный метод, эквивалентный json.loads(response.text)
print(data['status'])

Пример 5. Потоковое чтение большого массива объектов с ijson

Допустим, файл big_array.json содержит массив из миллионов объектов. Нужно обработать каждый объект по отдельности.

Пример
import ijson

with open('big_array.json', 'r', encoding='utf-8') as f:
    # Извлекаем элементы по пути 'item'
    for obj in ijson.items(f, 'item'):
        process(obj)  # ваша функция обработки

# Альтернатива: парсинг с фильтрацией
parser = ijson.parse(f)
for prefix, event, value in parser:
    if prefix == 'item.id' and event == 'number':
        print('ID:', value)

Пример 6. Использование Pathlib для работы с путями

Современный способ чтения файлов с помощью pathlib.Path делает код более читаемым.

Пример
import json
from pathlib import Path

file_path = Path('data/config.json')
if file_path.exists():
    with file_path.open('r', encoding='utf-8') as f:
        config = json.load(f)
    print('Настройки загружены')
else:
    print('Файл не найден')

Пример 7. Чтение JSON с комментариями (нестандартный)

Некоторые конфигурационные файлы содержат комментарии (например, //). Стандартный json.load их не понимает. Можно очистить строку заранее.

Пример
import json
import re

with open('config_with_comments.json', 'r', encoding='utf-8') as f:
    raw = f.read()
    # Удаление однострочных комментариев
    cleaned = re.sub(r'(?m)//.*?$', '', raw)
    data = json.loads(cleaned)
print(data['database'])

Подобный подход работает только для простых комментариев и не гарантирует корректность для многострочных.

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

Чтение данных из JSON-файла (json.load) в Python - comments

En
Python read json file (python)