Практические приемы формирования CSV-документов на языке Python

Раздел: Работа с файлами -> Работа с CSV-файлами

Основные способы создания 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-файл.

Создание CSV-файла в Python - comments

En
Python создать csv (python)