Нашли ошибку?
базовыйpandas 3.0.6

Excel, JSON, Parquet

Прочитать и записать таблицу в Excel, JSON и Parquet — и выбрать формат, который сохраняет типы.

Нужно знать:Чтение CSV: read_csv

Содержание статьи

Коротко

  • Excel: read_excel(path, sheet_name=…) / to_excel(path, index=False). sheet_name=None читает все листы в словарь. Нужен пакет openpyxl.
  • Несколько листов в один файл — через pd.ExcelWriter.
  • JSON: to_json(orient="records") — список объектов; lines=True — по объекту на строку (JSON Lines). Для кириллицы — force_ascii=False.
  • Parquet: to_parquet / read_parquet — быстрый двоичный формат, который сохраняет типы (даты, категории, целые с пропусками). Нужен pyarrow.
  • CSV и JSON — текст: типы при чтении угадываются заново.

Синтаксис

pd.read_excel(path, sheet_name=0, usecols=None, skiprows=None)
df.to_excel(path, sheet_name="Sheet1", index=False)
with pd.ExcelWriter(path) as w: df.to_excel(w, sheet_name="…")
df.to_json(path=None, orient="records", lines=False, force_ascii=True)
pd.read_json(path_or_buffer, orient=None, lines=False)
df.to_parquet(path), pd.read_parquet(path, columns=None)

Параметры

ПараметрЧто делаетПо умолчанию
sheet_nameлист Excel: имя, номер, список или None — все листы0
orientвид JSON: "records" — список строк, "columns" — словарь столбцов, "split", "index"…"columns" для DataFrame
linesJSON Lines: по одному объекту на строкуFalse
force_asciiэкранировать не-ASCII символы (кириллицу) как \uXXXXTrue
date_formatв to_json: "iso" — даты строками ISO, "epoch" — миллисекундами"epoch" / "iso"
columnsв read_parquet: какие столбцы читатьNone

Примеры

Данные для примеровиспользуются во всех примерах ниже
from io import StringIO

sales = pd.DataFrame({
    "city": ["Омск", "Тула"],
    "date": pd.to_datetime(["2024-03-01", "2024-03-02"]),
    "cups": [120, 85],
})
Excel: записать и прочитать
sales.to_excel("report.xlsx", sheet_name="март", index=False)
pd.read_excel("report.xlsx", sheet_name="март")
Вывод
   city       date  cups
0  Омск 2024-03-01   120
1  Тула 2024-03-02    85
Несколько листов
with pd.ExcelWriter("report.xlsx") as writer:
    sales.to_excel(writer, sheet_name="март", index=False)
    sales.head(1).to_excel(writer, sheet_name="итоги", index=False)
sheets = pd.read_excel("report.xlsx", sheet_name=None)   # все листы — словарь
list(sheets)
Вывод
['март', 'итоги']
JSON: список записей
text = sales.to_json(orient="records", force_ascii=False, date_format="iso")
print(text)
pd.read_json(StringIO(text), orient="records")
Вывод
[{"city":"Омск","date":"2024-03-01T00:00:00.000","cups":120},{"city":"Тула","date":"2024-03-02T00:00:00.000","cups":85}]
   city       date  cups
0  Омск 2024-03-01   120
1  Тула 2024-03-02    85
JSON Lines
sales.to_json("log.jsonl", orient="records", lines=True, force_ascii=False, date_format="iso")
with open("log.jsonl", encoding="utf-8") as f:
    print(f.read())
pd.read_json("log.jsonl", lines=True)
Вывод
{"city":"Омск","date":"2024-03-01T00:00:00.000","cups":120}
{"city":"Тула","date":"2024-03-02T00:00:00.000","cups":85}

   city       date  cups
0  Омск 2024-03-01   120
1  Тула 2024-03-02    85
Parquet сохраняет типы
sales.to_parquet("sales.parquet")
pd.read_parquet("sales.parquet").dtypes              # типы, включая даты, сохранены
Вывод
city               str
date    datetime64[us]
cups             int64
dtype: object

Подводные камни

CSV и JSON теряют типы

После записи в текст и чтения обратно даты становятся строками, категории — обычными строками. Для промежуточного хранения таблиц удобнее Parquet.

Дата после CSV
sales.to_csv("sales.csv", index=False)
pd.read_csv("sales.csv").dtypes                      # дата снова строка
Вывод
city      str
date      str
cups    int64
dtype: object

read_json со строкой JSON

Строка JSON вместо файлаошибка: FileNotFoundError
pd.read_json('[{"city": "Омск"}]')                   # строку воспринимает как путь к файлу
Ошибка
FileNotFoundError: File [{"city": "Омск"}] does not exist