Csv.reader: примеры (PYTHON)
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 файла с пропуском первой строки (заголовка).
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]}')Обработка файла, где числа должны преобразовываться в целочисленный формат.
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]))Использование пользовательского диалекта.
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 из строковой переменной (а не из файла).
import csv
from io import StringIO
csv_data = '''Имя,Возраст,Город
Анна,28,Москва
Иван,35,Санкт-Петербург'''
csvfile = StringIO(csv_data)
reader = csv.reader(csvfile)
for row in reader:
print(row)Обработка файла с фиксированным количеством столбцов и фильтрацией.
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 режима.
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}')Чтение файла с пропуском начальных пробелов в полях.
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)