Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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-разработке.