Практическое руководство по чтению CSV-файлов в Python

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

Введение в чтение CSV в Python

CSV (Comma-Separated Values) - один из самых распространенных форматов для хранения табличных данных. В Python существует несколько подходов для его чтения. Ниже рассматриваются основные варианты с примерами и указанием типичных проблем.

Какое решение обеспечивает максимальную производительность и удобство при работе с CSV?

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

import pandas as pd
df = pd.read_csv('data.csv')
print(df.head())

чтение csv python (чтение csv в python)

Пояснение: функция pd.read_csv читает файл и возвращает объект DataFrame. Параметр sep (по умолчанию ',') позволяет задать разделитель. Для больших файлов рекомендуется указывать chunksize или iterator.

Типичная ошибка: UnicodeDecodeError при неверной кодировке. Решение: указать параметр encoding, например encoding='utf-8' или encoding='cp1251'.

Если файл содержит строки с кавычками, pandas обрабатывает их автоматически, но при нестандартном формате может потребоваться параметр quoting.

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

Стандартный модуль csv входит в состав Python и не требует установки.

import csv
with open('data.csv', 'r', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

Пояснение: объект csv.reader возвращает итератор строк, каждая строка - список значений. Альтернатива - csv.DictReader, который использует первую строку как заголовки.

import csv
with open('data.csv', 'r', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row['Name'], row['Age'])

Ошибка: если в файле есть пустые строки, reader может пропустить их или вернуть пустой список. Рекомендуется проверять row на пустоту.

Проблема с разделителем: если разделитель не запятая (например, точка с запятой), укажите delimiter=';'.

Как загрузить CSV в массив NumPy?

Библиотека NumPy предоставляет функции loadtxt и genfromtxt для числовых данных.

import numpy as np
data = np.loadtxt('data.csv', delimiter=',', skiprows=1)
print(data.shape)

Пояснение: skiprows пропускает заголовок. genfromtxt умеет обрабатывать пропущенные значения через параметр missing_values.

Ошибка: если файл содержит строки или смешанные типы, loadtxt вызовет исключение. В таких случаях используйте genfromtxt с dtype=None.

Как обработать CSV вручную, используя только встроенные функции open и split?

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

with open('data.csv', 'r') as f:
    header = f.readline().strip().split(',')
    for line in f:
        row = line.strip().split(',')
        print(dict(zip(header, row)))

Пояснение: первая строка обрабатывается как заголовок, последующие строки преобразуются в словари. Недостаток - нет обработки кавычек и экранирования.

Проблема: split ошибочно разделит значения, содержащие запятые внутри кавычек. Для таких файлов этот метод неприменим.

Расширенные примеры чтения CSV в Python

Ниже приведены более сложные сценарии, включающие обработку больших файлов, нестандартные разделители и пропущенные значения.

Чтение большого CSV по частям (chunks)

Пример
import pandas as pd
chunk_iter = pd.read_csv('large_data.csv', chunksize=1000)
for chunk in chunk_iter:
    print(chunk.shape)
    # обработка очередного фрагмента
Результат: (1000, 10), (1000, 10), …

Пояснение: параметр chunksize превращает read_csv в итератор, позволяя обрабатывать данные частями, не загружая весь файл в память.

Использование пользовательских разделителей и кавычек

Пример
import pandas as pd
df = pd.read_csv('data.tsv', sep='\t', quotechar='"',
                  doublequote=True, encoding='utf-8')
print(df.head())

Пояснение: sep='\t' для TSV, quotechar задаёт символ кавычки, doublequote обрабатывает удвоенные кавычки внутри поля.

Обработка пропущенных значений и дополнительных пробелов

Пример
import pandas as pd
df = pd.read_csv('messy.csv', na_values=['NA', 'N/A', ''],
                  skipinitialspace=True)
print(df.isnull().sum())
Результат: столбец Age: 3 пропуска, столбец Name: 0

Пояснение: na_values указывает, какие строки считать NaN, skipinitialspace удаляет пробелы после разделителя.

Выборочное чтение столбцов и строк

Пример
import pandas as pd
df = pd.read_csv('data.csv', usecols=['Name', 'Age'],
                  skiprows=[1,3,5], nrows=100)
print(df.head())

Пояснение: usecols загружает только указанные столбцы, skiprows пропускает строки по индексам, nrows ограничивает количество читаемых строк.

Чтение CSV с несколькими заголовками

Пример
import pandas as pd
df = pd.read_csv('multi_header.csv', header=[0,1])
print(df.columns)
Результат: MultiIndex([('Year', 'Sales'), ('Year', 'Profit')], …)

Пояснение: header=[0,1] использует первые две строки как многоуровневый заголовок.

Ручное чтение с обработкой кавычек (модуль csv)

Пример
import csv
with open('complex.csv', 'r') as f:
    reader = csv.reader(f, delimiter=',', quotechar='"',
                        quoting=csv.QUOTE_MINIMAL)
    for row in reader:
        print(row)

Пояснение: параметр quoting определяет, как обрабатывать поля с кавычками. QUOTE_MINIMAL экранирует только при необходимости.

Использование numpy.genfromtxt для смешанных типов

Пример
import numpy as np
data = np.genfromtxt('mixed.csv', delimiter=',', dtype=None,
                     names=True, encoding='utf-8')
print(data.dtype)
Результат: [('Name', '

Пояснение: dtype=None позволяет автоматически определять типы каждого столбца, names=True использует первую строку как имена полей.

Чтение CSV в Python - comments

En
чтение csv python (python)