Коротко
- 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 — все листы0orientвид JSON: "records" — список строк, "columns" — словарь столбцов, "split", "index"…"columns" для DataFramelinesJSON Lines: по одному объекту на строкуFalseforce_asciiэкранировать не-ASCII символы (кириллицу) как \uXXXXTruedate_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],
})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)Вывод
['март', 'итоги']
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 85sales.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 85sales.to_parquet("sales.parquet")
pd.read_parquet("sales.parquet").dtypes # типы, включая даты, сохраненыВывод
city str date datetime64[us] cups int64 dtype: object
Подводные камни
CSV и JSON теряют типы
После записи в текст и чтения обратно даты становятся строками, категории — обычными строками. Для промежуточного хранения таблиц удобнее Parquet.
sales.to_csv("sales.csv", index=False)
pd.read_csv("sales.csv").dtypes # дата снова строкаВывод
city str date str cups int64 dtype: object
read_json со строкой JSON
pd.read_json('[{"city": "Омск"}]') # строку воспринимает как путь к файлуОшибка
FileNotFoundError: File [{"city": "Омск"}] does not exist