Практические приемы формирования CSV-документов на языке Python
Основные способы создания CSV файлов
Наиболее эффективным и стандартным способом является использование встроенного модуля csv. Метод writer создает объект записи, который позволяет добавлять строки с помощью writerow или writerows.
import csv
with open('data.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Имя', 'Возраст', 'Город'])
writer.writerow(['Анна', 25, 'Москва'])
writer.writerow(['Иван', 30, 'Санкт-Петербург'])Python работа с csv (работа с csv-файлами в python)
После выполнения в текущей папке появится файл data.csv с тремя строками, разделенными запятыми.
Как создать CSV файл с помощью DictWriter?
Если данные представлены в виде словарей, удобно использовать csv.DictWriter. Он автоматически сопоставляет ключи словаря с названиями столбцов.
import csv
with open('people.csv', 'w', newline='', encoding='utf-8') as f:
fieldnames = ['Имя', 'Возраст', 'Город']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'Имя': 'Мария', 'Возраст': 28, 'Город': 'Казань'})
writer.writerow({'Имя': 'Петр', 'Возраст': 35, 'Город': 'Новосибирск'})Csv формат python (формат csv в python)
Параметр fieldnames определяет порядок столбцов. Метод writeheader() записывает заголовок.
Как изменить разделитель или символ кавычек?
При создании объекта writer можно указать параметры delimiter, quotechar, quoting. Например, для табуляции:
import csv
with open('data.tsv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f, delimiter='\t', quotechar='"')
writer.writerow(['a', 'b', 'c'])
Python читаем csv (чтение csv-файла в python)
Как записать строки без использования модуля csv?
Можно вручную формировать строки с разделителями, однако такой подход не обрабатывает экранирование и кавычки корректно. Рекомендуется использовать только для простых данных без запятых и кавычек.
data = [['x', 'y'], [1, 2]]
with open('simple.csv', 'w', encoding='utf-8') as f:
for row in data:
f.write(','.join(map(str, row)) + '\n')Python создать csv (создание csv-файла в python)
Как записать CSV в строку (объект StringIO) вместо файла?
Иногда требуется получить содержимое CSV в виде строки, например для отправки по HTTP. StringIO из модуля io позволяет имитировать файл.
import csv
from io import StringIO
output = StringIO()
writer = csv.writer(output)
writer.writerow(['a', 'b'])
data = output.getvalue() # 'a,b\r\n'
Обратите внимание на символы конца строки в зависимости от платформы.
Типичные ошибки и их решение
- Проблема пустых строк между записями: При открытии файла без
newline=''на Windows может возникать лишняя пустая строка. Решение: всегда указыватьnewline=''. - Кодировка символов: Если данные содержат русские буквы, необходимо указать
encoding='utf-8'или другую нужную кодировку. Иначе возможны ошибки UnicodeEncodeError. - Некорректное экранирование запятых и кавычек: При ручной записи строки с запятой внутри значения нарушают структуру CSV. Модуль
csvавтоматически экранирует такие символы. - Проблемы с заголовками при использовании DictWriter: Если в словаре отсутствует ключ из
fieldnames, будет ошибка. Используйте аргументrestvalилиextrasaction='ignore'.
Дополнительные примеры и сценарии
Ниже представлены расширенные примеры с кодом и результатами, демонстрирующие гибкость работы с CSV в Python.
Запись списка словарей с разными кодировками
import csv
data = [
{'name': 'Alice', 'age': 30},
{'name': 'Bob', 'age': 25}
]
with open('utf8.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['name', 'age'])
writer.writeheader()
writer.writerows(data)
with open('cp1251.csv', 'w', newline='', encoding='cp1251') as f:
writer = csv.DictWriter(f, fieldnames=['name', 'age'])
writer.writeheader()
writer.writerows(data)
Файлы utf8.csv и cp1251.csv созданы с одинаковым содержимым, но в разных кодировках.
Использование различных стилей кавычек (quoting)
import csv
row = ['Hello, World', 100, 'Quote "here"']
with open('quoting.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f, quoting=csv.QUOTE_ALL)
writer.writerow(row)
Содержимое quoting.csv: "Hello, World","100","Quote ""here"""
Параметр quoting=csv.QUOTE_ALL помещает все поля в кавычки. Другие варианты: QUOTE_MINIMAL (только если требуется), QUOTE_NONNUMERIC, QUOTE_NONE.
Запись больших объёмов данных с использованием writerows
import csv
rows = [[i, i*2, i*3] for i in range(1000)]
with open('large.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerows(rows)
Файл large.csv содержит 1000 строк с тремя числами в каждой.
Обработка данных с пропущенными значениями в DictWriter
import csv
fieldnames = ['name', 'age', 'city']
data = [
{'name': 'Alice', 'age': 30},
{'name': 'Bob', 'city': 'NY'}
]
with open('missing.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames, restval='N/A', extrasaction='ignore')
writer.writeheader()
writer.writerows(data)
В файле missing.csv: name,age,city; Alice,30,N/A; Bob,N/A,NY
Генерация CSV для отправки через веб-приложение (Flask)
from flask import Flask, Response
import csv
from io import StringIO
app = Flask(__name__)
@app.route('/download')
def download():
output = StringIO()
writer = csv.writer(output)
writer.writerow(['id', 'value'])
writer.writerow([1, 100])
output.seek(0)
return Response(output.getvalue(), mimetype='text/csv', headers={'Content-Disposition':'attachment;filename=data.csv'})
При переходе по /download браузер скачивает CSV-файл.