CSV-файлы в Python: как читать, создавать и обрабатывать данные

CSV-файлы в Python: как читать, создавать и обрабатывать данные
0
12

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

В Python есть встроенный модуль csv, поэтому для базовой работы с такими файлами не нужно устанавливать дополнительные библиотеки. С его помощью можно читать строки, получать данные в виде списков и словарей, создавать новые документы и сохранять изменения.

Для простых задач достаточно стандартного csv. Если предстоит анализировать большие таблицы, фильтровать записи, рассчитывать статистику или объединять наборы данных, может пригодиться pandas.

Что такое CSV и как устроен файл

CSV хранит таблицу в виде текстовых записей. Обычно каждая строка соответствует одной записи, а значения отдельных полей разделены запятыми.

Например, файл users.csv:

name,age,city
Анна,28,Москва
Иван,34,Казань
Ольга,25,Тула

В первой строке указаны заголовки столбцов, остальные строки содержат данные.

У CSV нет единственного обязательного стандарта, который одинаково соблюдают все приложения. Встречаются разные разделители, правила экранирования и кодировки. В русскоязычных таблицах вместо запятых иногда используют точку с запятой:

name;age;city
Анна;28;Москва
Иван;34;Казань
CSV-файлы в Python: как читать, создавать и обрабатывать данные

Это стоит учитывать при чтении файла в Python.

У CSV есть несколько особенностей:

  • значения хранятся в текстовом виде;
  • типы данных не задаются схемой: числа, даты и логические значения нужно интерпретировать отдельно;
  • первая строка может содержать заголовки, но это не обязательное требование;
  • поля могут включать запятые, кавычки и переносы строк, если они корректно оформлены;
  • формат не предназначен для хранения сложных вложенных структур.

CSV удобен для обмена данными с Excel, базами данных, аналитическими инструментами и веб-сервисами. Однако он не сохраняет формулы, оформление ячеек и структуру листов, как это делает XLSX.

Как открыть CSV-файл в Python

Для работы с CSV импортируют встроенный модуль:

import csv

Затем открывают файл стандартной функцией open().

import csv

with open("users.csv", "r", encoding="utf-8", newline="") as file:
    reader = csv.reader(file)

    for row in reader:
        print(row)

В результате каждая строка будет представлена списком: 

['name', 'age', 'city']
['Анна', '28', 'Москва']
['Иван', '34', 'Казань']
['Ольга', '25', 'Тула']
CSV-файлы в Python: как читать, создавать и обрабатывать данные

Разберем параметры:

  • r — режим чтения;
  • encoding=»utf-8″ — кодировка файла;
  • newline=»» — рекомендуемый режим для корректной обработки переносов строк модулем csv;
  • csv.reader() — создает объект для чтения записей.

Конструкция with автоматически закрывает файл после завершения работы, в том числе при возникновении исключения.

Если документ сохранен в другой кодировке, например Windows-1251, нужно указать подходящее значение encoding. Иначе при чтении русских букв может возникнуть UnicodeDecodeError или появятся некорректные символы.

Как читать CSV через csv.reader

Метод reader подходит, когда структура таблицы известна и удобнее обращаться к значениям по индексам.

Допустим, требуется получить имена пользователей и их возраст, пропустив заголовок.

import csv

with open("users.csv", "r", encoding="utf-8", newline="") as file:
    reader = csv.reader(file)
    next(reader, None)

    for row in reader:
        name = row[0]
        age = int(row[1])

        print(f"{name}: {age}")

Здесь next(reader, None) пропускает первую запись. Второй аргумент позволяет избежать ошибки, если файл пустой.

csv.reader() возвращает значения как строки. Если нужно выполнять математические операции, сравнивать даты или проверять логические условия, преобразование типов придется делать самостоятельно.

CSV-файлы в Python: как читать, создавать и обрабатывать данные

Например, int(row[1]) преобразует возраст в целое число. Если в столбце окажется пустая ячейка или текст вместо числа, программа получит ValueError.

★ Где этому научиться

Курс «Python Ninja» в Академии IT DMS

✓Основы Python с нуля: от переменных до ООП
✓Веб-приложения на Flask и Django, свои API
✓SQL, графические интерфейсы и машинное обучение на практике

Сертификат, диплом о переподготовке или удостоверение о повышении квалификации.

Перейти к курсу →ПромокодAFFTIMES

−5 % на первую покупку. Скидка суммируется с любыми акциями школы. Если оплачиваете через менеджера в чате, назовите ему промокод.

Как прочитать CSV с разделителем точка с запятой

Если файл использует ;, его нужно передать в параметре delimiter.

import csv

with open("users.csv", "r", encoding="utf-8", newline="") as file:
    reader = csv.reader(file, delimiter=";")

    for row in reader:
        print(row)

По умолчанию csv.reader() использует запятую. Если указать неправильный разделитель, Python может прочитать всю строку как одно поле.

Не стоит заменять запятые или точки с запятой через split(): такой подход ломается, когда разделитель встречается внутри значения в кавычках.

Например:

name,comment
Анна,"Работает с Python, SQL и API"

Корректный парсер определит здесь два столбца, а не четыре.

Как читать CSV через csv.DictReader

Если столбцы имеют названия, удобнее использовать csv.DictReader. Он позволяет обращаться к полям по имени, а не по позиции в списке.

import csv

with open("users.csv", "r", encoding="utf-8", newline="") as file:
    reader = csv.DictReader(file)

    for row in reader:
        print(row["name"], row["city"])

Каждая запись возвращается в виде словаря: 

{
    'name': 'Анна',
    'age': '28',
    'city': 'Москва'
}

DictReader автоматически использует первую строку как заголовок. Если заголовков нет, их можно задать самостоятельно:

reader = csv.DictReader(
    file,
    fieldnames=["name", "age", "city"]
)

В этом случае первая строка файла тоже будет считаться данными, если ее отдельно не пропустить.

У DictReader есть несколько полезных опций:

  • fieldnames — список имен столбцов;
  • если в строке меньше полей, недостающие значения заполняются пустой строкой;
  • лишние значения попадают в список, доступный по ключу None.

Как создать CSV-файл в Python

Для записи используют csv.writer(). Он преобразует последовательности значений в CSV-записи и самостоятельно обрабатывает кавычки и разделители.

import csv

users = [
    ["name", "age", "city"],
    ["Анна", 28, "Москва"],
    ["Иван", 34, "Казань"],
    ["Ольга", 25, "Тула"]
]

with open("users_new.csv", "w", encoding="utf-8", newline="") as file:
    writer = csv.writer(file)
    writer.writerows(users)
CSV-файлы в Python: как читать, создавать и обрабатывать данные

После выполнения скрипта в текущей рабочей директории появится users_new.csv.

Основные методы записи:

  • writer.writerow(row) — записать одну строку;
  • writer.writerows(rows) — записать несколько строк.

Режим w создает файл или перезаписывает существующий. Если требуется сохранить предыдущие записи и добавить новые, используют режим a.

with open("users_new.csv", "a", encoding="utf-8", newline="") as file:
    writer = csv.writer(file)
    writer.writerow(["Петр", 31, "Самара"])

При добавлении строк важно соблюдать существующий порядок столбцов. Иначе данные окажутся не в тех полях.

Как записать данные через csv.DictWriter

DictWriter подходит для формирования таблиц из словарей. Он удобен, когда данные получены из API, базы данных или другого источника в виде объектов с именованными полями.

import csv

users = [
    {"name": "Анна", "age": 28, "city": "Москва"},
    {"name": "Иван", "age": 34, "city": "Казань"}
]

columns = ["name", "age", "city"]

with open("users.csv", "w", encoding="utf-8", newline="") as file:
    writer = csv.DictWriter(file, fieldnames=columns)

    writer.writeheader()
    writer.writerows(users)

Метод writeheader() добавляет строку с названиями столбцов.

Если в словаре отсутствует какое-то поле, по умолчанию вместо него записывается пустая строка. Значения по умолчанию можно изменить через restval.

Параметр extrasaction=»raise» используется по умолчанию: если в словаре встретятся ключи, которых нет в fieldnames, возникнет ValueError. При необходимости можно задать extrasaction=»ignore», чтобы не записывать лишние поля.

Как обработать CSV с помощью pandas

Для аналитики и обработки таблиц часто выбирают библиотеку pandas. Она загружает CSV в структуру DataFrame, в которой доступны операции над столбцами, фильтрация, группировка и сортировка.

Установить библиотеку можно командой:

pip install pandas

Прочитать файл: 

import pandas as pd

df = pd.read_csv("users.csv", encoding="utf-8")

print(df.head())
print(df.info())

head() показывает первые строки, info() выводит информацию о столбцах, типах и пропущенных значениях.

Пример фильтрации:

adults = df[df["age"] >= 18]
adults.to_csv("adults.csv", index=False, encoding="utf-8")
CSV-файлы в Python: как читать, создавать и обрабатывать данные

Параметр index=False не позволяет записать служебный индекс DataFrame в отдельный столбец.

Полезные возможности pandas.read_csv():

ПараметрДля чего нужен
sepЗадает разделитель
encodingУказывает кодировку
usecolsПозволяет загрузить отдельные столбцы
dtypeФиксирует типы данных
nrowsОграничивает число читаемых записей
chunksizeЗагружает данные частями
parse_datesПозволяет преобразовать выбранные столбцы в даты

Например, если нужно загрузить только два столбца:

df = pd.read_csv(
    "users.csv",
    usecols=["name", "age"],
    dtype={"name": str, "age": "Int64"}
)

Здесь Int64 — nullable-тип pandas, который допускает пропущенные значения.

У pandas есть важная особенность: библиотека может автоматически распознавать пустые значения и преобразовывать типы. Это удобно при аналитике, но не всегда подходит для точного переноса исходных данных. Например, идентификатор 00125 может потерять ведущие нули при автоматическом определении числового типа.

Если значения нужно сохранить как текст, тип столбца лучше задать явно.

Для больших файлов предусмотрен chunksize:

for chunk in pd.read_csv("large.csv", chunksize=100_000):
    print(chunk.shape)

Как обработать большой CSV-файл без pandas

Если задача заключается в последовательном чтении и простой обработке строк, достаточно стандартного csv.

import csv

total = 0

with open("large.csv", "r", encoding="utf-8", newline="") as file:
    reader = csv.DictReader(file)

    for row in reader:
        total += int(row["amount"])

print(total)

reader и DictReader позволяют перебирать записи последовательно. В памяти не требуется хранить весь файл.

CSV-файлы в Python: как читать, создавать и обрабатывать данные

Так можно:

  • считать сумму или количество записей;
  • отбирать строки по условию;
  • искать некорректные значения;
  • переносить подходящие записи в другой файл.

Если нужно сохранить результат фильтрации, можно сразу записывать подходящие строки через csv.writer или csv.DictWriter.

Типичные ошибки при чтении и записи CSV

При работе с CSV чаще всего возникают проблемы с форматом исходного документа.

1. Ошибка FileNotFoundError.
Python ищет файл относительно текущей рабочей директории, которая может отличаться от папки со скриптом. Для диагностики можно проверить Path.cwd() из модуля pathlib или указать полный путь.

2. Некорректная кодировка.
Если файл сохранен в Windows-1251, попробуйте открыть его с encoding=»cp1251″. Кодировку лучше выяснить у источника.

3. Неверный разделитель.
Если строка возвращается одним элементом списка, проверьте delimiter. Для автоматического определения можно использовать csv.Sniffer, но его результат не гарантирован. На неоднозначных данных надежнее явно указать формат.

4. Ошибки при преобразовании типов.
Пустые поля, пробелы и некорректные значения могут приводить к ValueError. Проверяйте входные данные до вычислений.

5. Пропуск или смещение столбцов.
Причиной могут быть неверные заголовки, разное количество полей или неправильная интерпретация кавычек. Для важных выгрузок стоит проверять схему и число полей каждой записи.

6. Пустые строки при записи.
Открывайте файл с newline=»». Это рекомендуемый вариант для модуля csv, который сам управляет обработкой переводов строк.

Что выбрать: csv или pandas

Выбор зависит от задачи.

  • csv.reader — если нужно читать записи по порядку и работать с индексами.
  • csv.DictReader — если удобнее получать значения по именам столбцов.
  • csv.writer — для создания и последовательной записи CSV.
  • csv.DictWriter — для формирования выгрузок из словарей.
  • pandas — для аналитики, фильтрации, группировки и преобразования табличных данных.

Обычный модуль Python часто предпочтительнее для небольших утилит, потоковой обработки и простого обмена информацией. pandas удобнее для исследовательских задач и расчетов над таблицами.

Заключение

CSV-файлы в Python можно читать, создавать и обрабатывать без сторонних зависимостей. Для этого достаточно освоить csv.reader, csv.writer, csv.DictReader и csv.DictWriter.

Главное при работе с такими документами — правильно определить разделитель, кодировку, наличие заголовков и типы значений. Для больших выгрузок полезно обрабатывать записи последовательно или использовать чтение частями в pandas.

При обмене данными с другими системами также стоит проверять структуру строк, пропущенные значения и безопасность содержимого. Это помогает избежать ошибок при импорте, экспорте и дальнейшей обработке таблиц.

FAQ

Как проверить, что CSV-файл содержит правильное количество столбцов?

Можно сравнить число полей в каждой записи с ожидаемой схемой. При использовании csv.reader достаточно проверить len(row). Для DictReader также стоит учитывать лишние поля, которые попадают в ключ None, и отсутствующие значения.

Как объединить несколько CSV-файлов в один с помощью Python?

Если файлы имеют одинаковую структуру, можно последовательно читать их через csv.reader и записывать строки в общий документ с помощью csv.writer.

Как удалить дубликаты строк из CSV в Python?

Для небольших файлов можно использовать множество set, чтобы отслеживать уже встреченные записи.

Как отсортировать CSV-файл по столбцу в Python?

Для небольших таблиц можно загрузить записи в список, преобразовать значения нужного столбца и применить sorted(). Если сортировка выполняется по числовому полю, предварительно преобразуйте его в число, иначе строки "100" и "20" будут сравниваться лексикографически.

Как сохранить CSV, чтобы Excel правильно отображал русские буквы?

Сначала стоит проверить кодировку, которую поддерживает целевая версия Excel. Для совместимости часто используют UTF-8 с BOM, например при записи через encoding="utf-8-sig".

Лиля Райн
Лиля Райн
Автор
(Проголосовать за статью)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

X