Csv.reader: примеры (PYTHON)

Использование csv.reader для обработки данных в Python
Раздел: CSV, Работа с файлами
csv.reader(csvfile, dialect, fmtparams): _csv.reader

Основные сведения о функции csv.reader

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

Использование функции актуально при необходимости обработки табличных данных, экспортированных из электронных таблиц или баз данных. Функция обеспечивает корректную обработку кавычек, разделителей и специальных символов.

Аргументы функции

  • csvfile: Любой объект, поддерживающий протокол итератора и возвращающий строки при каждом вызове метода __next__(). Чаще всего это файловый объект, открытый с помощью open().
  • dialect='excel': Имя диалекта или экземпляр класса Dialect. Определяет набор параметров для разбора CSV. Встроенные диалекты: excel, excel-tab, unix.
  • delimiter=',': Символ, используемый для разделения полей в строке. Для табуляции используется '\t'.
  • quotechar='"': Символ, обрамляющий поля, содержащие специальные символы.
  • doublequote=True: Определяет, удваивается ли символ quotechar внутри поля для его экранирования.
  • skipinitialspace=False: Игнорирование пробелов, следующих непосредственно за разделителем.
  • strict=False: Если задано значение True, возбуждается исключение Error при некорректном CSV.
  • lineterminator='\r\n': Строка, разделяющая записи.
  • quoting=csv.QUOTE_MINIMAL: Контролирует поведение кавычек. Возможные значения: QUOTE_ALL, QUOTE_MINIMAL, QUOTE_NONNUMERIC, QUOTE_NONE.

Возвращаемое значение

Функция возвращает объект reader, являющийся итератором. При каждой итерации возвращается список строк, представляющих поля одной строки CSV-файла.

Примеры базового использования

Пример чтения простого CSV файла с разделителем-запятой.

import csv

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

Предположим, содержимое файла data.csv:

['Имя', 'Возраст', 'Город']
['Анна', '28', 'Москва']
['Иван', '35', 'Санкт-Петербург']

Пример с использованием точки с запятой в качестве разделителя.

import csv

with open('data_semicolon.csv', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile, delimiter=';')
    for row in reader:
        print(row)

Пример чтения файла, где строки заключены в кавычки.

import csv

with open('data_quoted.csv', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile, quotechar="'")
    for row in reader:
        print(row)

Похожие функции в Python

Модуль csv предоставляет другие функции для работы с CSV.

  • csv.DictReader: Возвращает не список, а словарь для каждой строки, используя первую строку (или предоставленный список) в качестве ключей. Удобен для доступа к данным по именам полей.
  • pandas.read_csv(): Функция из библиотеки Pandas, возвращающая DataFrame. Обладает обширными возможностями по обработке, фильтрации и анализу данных. Используется для сложных операций с большими объемами информации.
  • numpy.loadtxt(): Функция из NumPy для загрузки числовых данных в массив. Подходит для однородных числовых CSV без строковых заголовков.

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

Аналоги функции в других языках

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

PHP: Функция fgetcsv().

if (($handle = fopen("data.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        print_r($data);
    }
    fclose($handle);
}

JavaScript (Node.js): Модуль csv-parser или встроенный парсинг строк.

const fs = require('fs');
const csv = require('csv-parser');

fs.createReadStream('data.csv')
  .pipe(csv())
  .on('data', (row) => {
    console.log(row);
  });

Java: Библиотеки OpenCSV или Scanner.

import com.opencsv.CSVReader;
...
try (CSVReader reader = new CSVReader(new FileReader("data.csv"))) {
    String[] nextLine;
    while ((nextLine = reader.readNext()) != null) {
        System.out.println(Arrays.toString(nextLine));
    }
}

SQL: Команда COPY ... FROM или LOAD DATA INFILE (MySQL) для прямой загрузки в таблицу.

C#: Библиотека CsvHelper или встроенный TextFieldParser.

Golang: Пакет encoding/csv.

package main
import (
    "encoding/csv"
    "fmt"
    "os"
)
func main() {
    file, _ := os.Open("data.csv")
    reader := csv.NewReader(file)
    records, _ := reader.ReadAll()
    fmt.Println(records)
}

Основное отличие Python-функции - простота интеграции в итерационные процессы и работа с файловыми объектами.

Типичные ошибки при использовании

Ошибка из-за отсутствия параметра newline='' при открытии файла на Windows, что приводит к неправильной обработке переводов строк.

import csv

with open('data.csv', 'r', encoding='utf-8') as csvfile:  # Ошибка: нет newline=''
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)

Результатом могут быть строки с лишними символами \r.

Попытка работы с файлом после закрытия контекстного менеджера.

import csv

with open('data.csv', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
rows = list(reader)  # Ошибка: файл уже закрыт

Получим исключение: ValueError: I/O operation on closed file.

Неправильное указание кодировки для файла, содержащего не-ASCII символы.

import csv

with open('data.csv', newline='') as csvfile:  # Ошибка: кодировка по умолчанию может не подойти
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)

Может привести к ошибке UnicodeDecodeError.

Изменения в последних версиях Python

В Python 3.10 не было внесено значительных изменений в работу csv.reader. Однако в Python 3.11 была оптимизирована скорость работы некоторых встроенных модулей, что могло коснуться и модуля csv. Основные изменения связаны с развитием диалектов и обработкой ошибок в более ранних версиях.

Важным аспектом остается необходимость указания параметра newline='' при открытии файлов для кросс-платформенной корректности, что актуально с версии Python 3.x.

Расширенные примеры использования

Чтение CSV файла с пропуском первой строки (заголовка).

Пример python
import csv

with open('data_with_header.csv', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    headers = next(reader)  # Пропускаем первую строку
    print(f'Заголовки: {headers}')
    data = []
    for row in reader:
        data.append(row)
    print(f'Первая запись: {data[0]}')

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

Пример python
import csv

with open('data_numbers.csv', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile, quoting=csv.QUOTE_NONNUMERIC)
    for row in reader:
        # Все не заключенные в кавычки значения преобразуются в float
        print(row, type(row[1]))

Использование пользовательского диалекта.

Пример python
import csv

csv.register_dialect('my_dialect', delimiter='|', quotechar='"', quoting=csv.QUOTE_ALL)

with open('data_pipe.csv', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile, dialect='my_dialect')
    for row in reader:
        print(row)

Чтение строк CSV из строковой переменной (а не из файла).

Пример python
import csv
from io import StringIO

csv_data = '''Имя,Возраст,Город
Анна,28,Москва
Иван,35,Санкт-Петербург'''

csvfile = StringIO(csv_data)
reader = csv.reader(csvfile)
for row in reader:
    print(row)

Обработка файла с фиксированным количеством столбцов и фильтрацией.

Пример python
import csv

with open('data_large.csv', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    # Фильтрация: оставить только строки, где возраст больше 30
    filtered_rows = [row for row in reader if reader.line_num == 1 or (len(row) > 1 and int(row[1]) > 30)]
    for row in filtered_rows:
        print(row)

Обработка CSV с возможными ошибками в формате с использованием strict режима.

Пример python
import csv

csv_data = 'a,b,c\n1,2,3\n4,5\n6,7,8'  # Во второй строке только 2 значения
csvfile = StringIO(csv_data)
reader = csv.reader(csvfile, strict=True)
try:
    for row in reader:
        print(row)
except csv.Error as e:
    print(f'Ошибка в строке {reader.line_num}: {e}')

Чтение файла с пропуском начальных пробелов в полях.

Пример python
import csv

with open('data_spaces.csv', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile, skipinitialspace=True)
    for row in reader:
        print(row)

питон csv.reader function comments

En
Csv.reader Read CSV file