Чтение файлов JSON в Python: полное руководство
Чтение JSON в Python
Для работы с JSON в Python встроен модуль json. Он предоставляет функции для чтения данных из файлов и строк. Ниже рассмотрены основные способы, варианты для разных ситуаций и типичные проблемы.
Наиболее эффективное решение для чтения JSON из файла - использование функции json.load() в сочетании с контекстным менеджером with. Это гарантирует корректное закрытие файла даже при возникновении ошибок.
import json
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(data)Python чтение json (чтение json в python)
Пояснение шагов:
- Модуль json импортируется.
- Файл data.json открывается в режиме чтения ('r') с указанием кодировки utf-8.
- Контекстный менеджер with автоматически закроет файл после выхода из блока.
- json.load(f) читает файловый объект и преобразует содержимое в объект Python (словарь, список и т.д.).
- Результат сохраняется в переменной data.
Типичная ошибка: файл отсутствует или путь указан неверно - возникает исключение FileNotFoundError. Решение: проверить путь, использовать абсолютный путь или обработать исключение.
try:
with open('data.json', 'r') as f:
data = json.load(f)
except FileNotFoundError:
print('Файл не найден')Другая распространённая проблема - некорректный JSON (лишние запятые, неправильные кавычки). Возникает json.JSONDecodeError. Решение: проверить файл на валидность через онлайн-валидатор или использовать try/except.
try:
data = json.load(f)
except json.JSONDecodeError as e:
print('Ошибка декодирования:', e)Цель: быстрое и надёжное чтение JSON из файла. Используется, когда данные хранятся в локальном файле и не требуется дополнительная обработка.
Как прочитать JSON из строки, а не из файла?
Когда данные уже загружены в строковую переменную (например, получены по сети или из базы данных), применяется json.loads().
json_str = '{"name": "Alice", "age": 30}'
data = json.loads(json_str)
print(data['name'])Ошибка: строка содержит невалидный JSON. Используйте try/except как показано выше.
Цель: преобразование строки в объект Python, когда источник не является файлом. Часто используется с HTTP-ответами.
Как читать JSON из URL-адреса?
Для получения JSON с веб-сервера нужна библиотека requests. Ответ необходимо декодировать.
import requests
response = requests.get('https://api.example.com/data')
response.raise_for_status() # проверка на ошибки HTTP
data = response.json() # автоматически декодирует JSON из тела ответа
print(data)Проблемы: сетевые ошибки (ConnectionError), некорректный статус (HTTPError). Обрабатываются через try/except. Если сервер возвращает не JSON, response.json() вызовет JSONDecodeError.
Цель: чтение удалённых данных, например, с REST API. Метод response.json() эквивалентен json.loads(response.text).
Как читать большие JSON-файлы, не загружая их целиком в память?
Стандартный json.load() загружает весь файл в память, что проблематично для гигабайтных данных. Для потокового чтения подходит библиотека ijson.
import ijson
with open('large.json', 'r', encoding='utf-8') as f:
parser = ijson.parse(f)
for prefix, event, value in parser:
if event == 'map_key' and prefix == '':
print('Ключ:', value)Проблема: библиотека не встроенная, требует установки (pip install ijson). Также возможны сложности с выбором нужных элементов.
Цель: обработка JSON-файлов, не помещающихся в оперативную память. Альтернатива - построчное чтение, если файл представляет собой NDJSON (каждая строка - отдельный JSON).
Как прочитать JSON с помощью pandas?
Библиотека pandas предоставляет функцию read_json(), которая преобразует JSON в DataFrame.
import pandas as pd
df = pd.read_json('data.json')
print(df.head())Формат JSON должен соответствовать табличной структуре (например, список объектов). Иначе pandas может интерпретировать данные неверно. Используйте параметр orient для указания формата.
df = pd.read_json('nested.json', orient='records')Цель: быстрая загрузка данных для анализа в табличном виде. Требуется установка pandas.
Расширенные примеры, демонстрирующие нестандартные сценарии чтения JSON в Python.
Чтение вложенного JSON с object_hook
Функция json.load() принимает параметр object_hook, который позволяет преобразовывать словари в пользовательские объекты.
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'Person({self.name}, {self.age})'
def hook(dct):
if 'name' in dct and 'age' in dct:
return Person(dct['name'], dct['age'])
return dct
json_str = '{"name": "Bob", "age": 25}'
obj = json.loads(json_str, object_hook=hook)
print(obj)
print(type(obj))Person(Bob, 25) <class '__main__.Person'>
Чтение JSON из gz-архива без распаковки на диск
Модуль gzip позволяет читать сжатые файлы напрямую.
import gzip
import json
with gzip.open('data.json.gz', 'rt', encoding='utf-8') as f:
data = json.load(f)
print(data)Ошибка: файл не является gz-архивом - gzip.BadGzipFile. Проверяйте расширение.
Чтение NDJSON (JSON Lines)
Файл, где каждая строка - отдельный JSON-объект. Читается построчно.
import json
with open('data.ndjson', 'r', encoding='utf-8') as f:
for line in f:
obj = json.loads(line.strip())
print(obj.get('id'))Чтение JSON с ключами, содержащими точки
Стандартный json не обрабатывает точки особым образом, но при преобразовании вложенных структур может понадобиться проход по ключам.
import json
json_str = '{"person.name": "Alice", "person.age": 30}'
data = json.loads(json_str)
# Доступ к ключу с точкой:
print(data['person.name'])Alice
Использование json.JSONDecoder для кастомного типа
Можно создать свой декодер, переопределив метод decode().
import json
class CustomDecoder(json.JSONDecoder):
def decode(self, s):
obj = super().decode(s)
# дополнительная обработка
return {k.upper(): v for k, v in obj.items()}
decoder = CustomDecoder()
result = decoder.decode('{"name": "test"}')
print(result){'NAME': 'test'}