← Назад к вопросам

Что такое Comma Separated Values (CSV)?

1.8 Middle🔥 181 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Comma Separated Values (CSV)

CSV (Comma Separated Values) — это простой текстовый формат для хранения табличных данных, где каждая строка представляет одну запись, а значения разделены запятыми. Это один из самых распространенных форматов для обмена данными между приложениями.

Базовая структура CSV

Имя,Возраст,Город
Иван,28,Москва
Мария,32,Санкт-Петербург
Сергей,25,Казань

Первая строка обычно содержит заголовки (names полей), остальные строки содержат данные.

Характеристики CSV

Преимущества:

  • Простой текстовый формат (читается любым редактором)
  • Легко парсится и генерируется
  • Совместим со всеми языками программирования
  • Экспортируется из Excel и других таблиц
  • Минимальный размер файла

Недостатки:

  • Нет встроенной типизации (всё строки)
  • Сложности с кавычками и специальными символами
  • Нет поддержки вложенных структур
  • Амбигуозность разделителя (может быть не только запятая)

Работа с CSV в Python

Встроенный модуль csv:

import csv

# Чтение CSV файла
with open('users.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)  # row это список: ['Иван', '28', 'Москва']

Чтение с DictReader (удобнее):

import csv

with open('users.csv', 'r') as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(row)  # row это словарь: {'Имя': 'Иван', 'Возраст': '28', 'Город': 'Москва'}
        print(row['Имя'])  # Прямой доступ к полям

Запись в CSV:

import csv

data = [
    {'Имя': 'Иван', 'Возраст': 28, 'Город': 'Москва'},
    {'Имя': 'Мария', 'Возраст': 32, 'Город': 'СПб'},
]

with open('output.csv', 'w', newline='') as file:
    fieldnames = ['Имя', 'Возраст', 'Город']
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()  # Пишем заголовки
    writer.writerows(data)  # Пишем данные

Проблемы с спецсимволами

Если данные содержат запятую, кавычку или перевод строки — они должны быть экранированы:

"Фамилия, Имя",Возраст
"Сидоров, Иван",28
"Петров, Петр",30

Модуль csv автоматически это обрабатывает:

import csv

data = [{'name': 'Сидоров, Иван', 'age': 28}]

with open('test.csv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=['name', 'age'])
    writer.writeheader()
    writer.writerows(data)

# CSV автоматически оберёт значение в кавычки

Разные разделители

Не всегда разделитель это запятая. Популярные альтернативы:

  • Точка с запятой (;) — в европейских локалях
  • Табуляция (\t) — для TSV (Tab Separated Values)
  • Трубка (|) — для PSV (Pipe Separated Values)
import csv

# Чтение с точкой с запятой
with open('data.csv', 'r') as f:
    reader = csv.DictReader(f, delimiter=';')
    for row in reader:
        print(row)

# Запись с табуляцией
with open('data.tsv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=['name', 'age'], delimiter='\t')
    writer.writeheader()
    writer.writerows(data)

Практический пример: парсинг CSV с обработкой типов

import csv
from datetime import datetime

def parse_csv_with_types(filename):
    results = []
    with open(filename, 'r') as f:
        reader = csv.DictReader(f)
        for row in reader:
            results.append({
                'name': row['name'].strip(),  # Удалить пробелы
                'age': int(row['age']),  # Преобразовать в число
                'joined': datetime.fromisoformat(row['joined']),  # Дата
            })
    return results

Работа с большими файлами

Для больших CSV файлов используйте pandas (очень быстро):

import pandas as pd

# Чтение
df = pd.read_csv('large_file.csv')
print(df.head())  # Первые 5 строк

# Фильтрация
filtered = df[df['age'] > 30]

# Запись
df.to_csv('output.csv', index=False)

Или читайте по чанкам:

import csv

def read_csv_chunked(filename, chunk_size=1000):
    with open(filename, 'r') as f:
        reader = csv.DictReader(f)
        chunk = []
        for row in reader:
            chunk.append(row)
            if len(chunk) == chunk_size:
                yield chunk
                chunk = []
        if chunk:
            yield chunk  # Последний чанк

for rows in read_csv_chunked('huge.csv'):
    process_batch(rows)  # Обрабатываем по 1000 строк

Стандартные диалекты CSV

Модуль csv поддерживает разные диалекты:

import csv

# Стандартный excel диалект
with open('file.csv', 'w', newline='') as f:
    writer = csv.writer(f, dialect='excel')
    writer.writerow(['name', 'age'])
    writer.writerow(['Иван', 28])

# unix диалект (без пробелов)
with open('file.csv', 'w', newline='') as f:
    writer = csv.writer(f, dialect='unix')
    writer.writerow(['name', 'age'])

Безопасность при парсинге CSV

import csv
import io

# Если CSV это user input, ограничивайте размер
max_lines = 10000
lines = user_input.split('\n')[:max_lines]
content = '\n'.join(lines)

# Парсим из строки
reader = csv.DictReader(io.StringIO(content))
for row in reader:
    process(row)

Когда использовать CSV

  • Экспорт из баз данных — быстро и легко
  • Интеграция с Excel — надежная поддержка
  • Обмен данными — универсальный формат
  • Логирование структурированных данных — простая обработка

Когда использовать JSON вместо CSV

  • Иерархические данные — JSON лучше
  • Различные типы — JSON типизирован
  • API — JSON стандарт
  • Вложенные объекты — CSV не подходит

CSV остается одним из самых практичных форматов для табличных данных в enterprise-разработке.