Python: как записать и прочитать CSV-файл
Для работы с CSV в Python есть стандартный модуль csv. Записывать строки удобно через csv.writer или csv.DictWriter, читать через csv.reader или csv.DictReader. Файл всегда открывайте с параметрами newline="" и encoding.
Записать список строк
import csv
rows = [
["Название", "Цена", "Остаток"],
["Хлеб", 45, 12],
["Молоко, 3.2%", 90, 7],
]
with open("goods.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerows(rows)Значение с запятой внутри, например Молоко, 3.2%, модуль сам заключит в кавычки. Параметр newline="" нужен, чтобы на Windows не появлялись пустые строки между записями.
Прочитать файл
with open("goods.csv", newline="", encoding="utf-8") as f:
for row in csv.reader(f):
print(row)Все значения читаются как строки. Числа нужно приводить вручную: int(row[1]).
Работа со словарями
DictWriter и DictReader позволяют обращаться к столбцам по названию:
goods = [
{"name": "Хлеб", "price": 45},
{"name": "Сыр", "price": 450},
]
with open("prices.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["name", "price"])
writer.writeheader()
writer.writerows(goods)
with open("prices.csv", newline="", encoding="utf-8") as f:
items = list(csv.DictReader(f))
print(items[0]) # {'name': 'Хлеб', 'price': '45'}
print(sum(int(i["price"]) for i in items)) # 495CSV для Excel
Русская версия Excel ожидает точку с запятой и кодировку UTF-8 с BOM. Иначе кириллица превращается в нечитаемые символы:
with open("for_excel.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f, delimiter=";")
writer.writerow(["Имя", "Город"])
writer.writerow(["Анна", "Казань"])
with open("for_excel.csv", encoding="utf-8-sig") as f:
print(f.read().splitlines()[1]) # Анна;КазаньДругие разделители
Файл | Параметр |
|---|---|
Точка с запятой |
|
Табуляция (TSV) |
|
Все значения в кавычках |
|
Добавить строку в конец файла
with open("goods.csv", "a", newline="", encoding="utf-8") as f:
csv.writer(f).writerow(["Чай", 120, 30])
with open("goods.csv", newline="", encoding="utf-8") as f:
print(len(list(csv.reader(f)))) # 4Частые вопросы
Почему при чтении числа остаются строками?
Формат CSV не хранит типы. csv возвращает текст, и преобразование в числа и даты нужно сделать самостоятельно или использовать библиотеку pandas.
Как прочитать большой CSV, не загружая его целиком?
Перебирайте csv.reader в цикле: он отдаёт строки по одной и не читает весь файл в память.