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

Как открыть csv файл в python

Как открыть csv файл в python

Формат CSV применяется для хранения табличных данных: каждая строка – отдельная запись, а значения внутри неё разделяются запятыми, точкой с запятой или табуляцией. Такой файл можно встретить при выгрузке отчетов из Excel, систем аналитики, бухгалтерских программ или баз данных. В Python есть несколько способов работать с CSV: встроенный модуль csv, библиотека pandas и методы стандартной функции open().

Модуль csv входит в стандартную библиотеку Python и позволяет читать и записывать данные без установки дополнительных пакетов. Он удобен, если требуется построчная обработка, контроль разделителей или работа с файлами небольшого размера. Для анализа больших таблиц чаще используют pandas – этот инструмент преобразует CSV в объект DataFrame, который поддерживает фильтрацию, группировку и статистические операции.

При открытии файла важно учитывать кодировку: многие CSV сохраняются в UTF-8, но выгрузки из Windows-программ могут использовать CP1251. Если не указать кодировку явно, чтение может завершиться ошибкой или появятся искаженные символы. Также следует обращать внимание на разделитель: в некоторых странах данные формируются с «;» вместо запятой, поэтому при работе с функциями чтения стоит задавать параметр delimiter.

Открытие CSV с помощью встроенной функции open()

Функция open() позволяет открыть CSV-файл как обычный текстовый. Обычно используют режим ‘r’ для чтения или ‘w’ для записи. Для работы с кириллическими данными рекомендуется указывать encoding=’utf-8′.

Пример чтения строк:

with open('data.csv', 'r', encoding='utf-8') as file:
for line in file:
print(line.strip().split(','))

Каждая строка представляется как список значений, разделённых запятой. Такой способ удобен при небольших файлах и простых структурах.

При записи данных используйте конструкцию:

rows = [
['id', 'name', 'age'],
[1, 'Иван', 25],
[2, 'Анна', 30]
]
with open('output.csv', 'w', encoding='utf-8') as file:
for row in rows:
file.write(','.join(map(str, row)) + '\n')

Важно вручную обрабатывать разделители и экранирование. Для более сложных файлов лучше использовать модуль csv, но open() остаётся базовым инструментом для полного контроля над форматом.

Чтение строк CSV с использованием модуля csv

Чтение строк CSV с использованием модуля csv

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

Для открытия файла используется конструкция with open(). Объект файла передаётся в csv.reader, который возвращает итератор. Каждая строка преобразуется в список значений, разделённых указанным разделителем (по умолчанию – запятая).

Пример базового чтения:

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

Параметр newline=»» предотвращает удвоение пустых строк при чтении на Windows. Если файл использует другой разделитель (например, точку с запятой), его необходимо явно указать в аргументе delimiter.

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

next(reader)  # пропуск заголовка
for row in reader:
...

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

Загрузка CSV в список словарей через DictReader

Модуль csv содержит класс DictReader, который формирует каждую строку файла как словарь: ключами становятся названия столбцов, значениями – данные ячеек.

Пример кода:

import csv
with open("data.csv", encoding="utf-8") as f:
reader = csv.DictReader(f)
rows = [row for row in reader]
print(rows[0])

Файл data.csv с заголовками name,age,city будет преобразован в список вида:

[{'name': 'Иван', 'age': '25', 'city': 'Москва'},
{'name': 'Анна', 'age': '30', 'city': 'Казань'}]

Если в файле отсутствует строка с названиями столбцов, передайте список в параметр fieldnames:

reader = csv.DictReader(f, fieldnames=["col1", "col2", "col3"])

При необходимости изменить разделитель используйте delimiter, например csv.DictReader(f, delimiter=";"). Это важно для файлов, сохранённых из Excel, где часто применяется «;» вместо «,».

Работа с CSV в библиотеке pandas через read_csv()

Функция pandas.read_csv() загружает данные из CSV напрямую в объект DataFrame, что позволяет сразу работать с таблицей как с полноценной структурой. Базовое использование:

import pandas as pd
df = pd.read_csv("data.csv")

Для файлов с нестандартным разделителем указывается параметр sep, например: pd.read_csv("data.csv", sep=";"). Если в таблице используется кодировка UTF-8 с BOM, рекомендуется encoding=»utf-8-sig», а для Windows-1251 – encoding=»cp1251″.

Столбец можно назначить индексом через index_col: pd.read_csv("data.csv", index_col="id"). При больших объёмах данных стоит ограничить загрузку нужными столбцами через usecols или считать только первые строки с помощью nrows.

Для ускорения обработки больших файлов часто применяют параметр dtype, чтобы задать типы столбцов вручную. Пример: pd.read_csv("data.csv", dtype={"id": "int32", "price": "float32"}).

Если в данных присутствуют пропуски, можно указать список значений, которые будут интерпретироваться как NaN: pd.read_csv("data.csv", na_values=["NA", "-"]).

При построчной обработке больших CSV удобен параметр chunksize, возвращающий генератор с указанным количеством строк: for chunk in pd.read_csv("data.csv", chunksize=10000): ....

Задание кодировки при открытии CSV файла

Задание кодировки при открытии CSV файла

При работе с CSV-файлами в Python важно указать правильную кодировку. Если этого не сделать, возможны ошибки декодирования или искажение символов.

Наиболее часто встречаются кодировки UTF-8, UTF-8-SIG и cp1251. Выбор зависит от того, в какой среде создавался файл: Excel в Windows чаще сохраняет в cp1251, а современные программы экспорта данных используют UTF-8.

Пример открытия файла с указанием кодировки:

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

Если при чтении встречаются ошибки, стоит попробовать другую кодировку:

with open("data.csv", "r", encoding="cp1251", errors="replace") as f:
text = f.read()

Сравнение популярных кодировок:

Кодировка Когда использовать Особенности
UTF-8 Большинство современных систем Универсальна, поддерживает все символы Unicode
UTF-8-SIG Файлы из Excel с BOM Избавляет от появления лишних символов в первой строке
cp1251 Файлы из старых версий Excel под Windows Поддерживает только кириллицу

Чтобы определить правильную кодировку, можно использовать библиотеку chardet или charset-normalizer для автоматического анализа:

import chardet
with open("data.csv", "rb") as f:
result = chardet.detect(f.read(50000))
print(result)

Чтение больших CSV файлов по частям

Пример: `for chunk in pd.read_csv(«file.csv», chunksize=100000):` позволяет обрабатывать файл блоками по 100 000 строк. Каждая часть возвращается как DataFrame, что упрощает фильтрацию, агрегацию или запись в другую таблицу без загрузки всего файла.

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

Для ускорения чтения можно использовать параметр `usecols`, чтобы загружать только нужные столбцы, и `dtype`, чтобы заранее задать типы данных. Например, `pd.read_csv(«file.csv», chunksize=50000, usecols=[«id»,»value»], dtype={«id»:int,»value»:float})`.

После обработки всех частей можно объединить результаты через `pd.concat` или агрегировать статистику по мере чтения блоков, что позволяет работать с файлами любого объема на стандартном оборудовании.

Обработка разделителей и кавычек в CSV

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

Пример указания разделителя при чтении файла:

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

Кавычки используются для группировки текста с внутренними запятыми или пробелами. В Python их можно задать через параметр quotechar. Например:

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

Если в ячейках встречаются кавычки, их нужно экранировать двойными кавычками:

"Иван ""Иваныч"" Петров", 35, Москва

При записи CSV-файла также важно указывать разделитель и кавычки:

with open('output.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL)
writer.writerow(['Имя', 'Возраст', 'Город'])
writer.writerow(['Иван "Иваныч" Петров', 35, 'Москва'])
  • delimiter – символ, разделяющий столбцы.
  • quotechar – символ для заключения текста с пробелами или запятыми.
  • quoting – режим использования кавычек: csv.QUOTE_MINIMAL, csv.QUOTE_ALL, csv.QUOTE_NONNUMERIC, csv.QUOTE_NONE.

Для нестандартных CSV, где кавычки могут отсутствовать или использоваться другие символы, допустимо применять csv.Sniffer для автоматического определения формата:

with open('data.csv', newline='', encoding='utf-8') as f:
sample = f.read(1024)
dialect = csv.Sniffer().sniff(sample)
f.seek(0)
reader = csv.reader(f, dialect)
for row in reader:
print(row)

Чтение CSV из удалённого источника по URL

Чтение CSV из удалённого источника по URL

Python позволяет работать с CSV-файлами, находящимися на веб-серверах, без необходимости предварительного скачивания. Для этого чаще всего используют библиотеки pandas или requests.

Пример с pandas:

import pandas as pd
url = "https://example.com/data.csv"
data = pd.read_csv(url)
print(data.head())

Преимущества подхода через pandas:

  • Автоматическое определение разделителей и кодировки в большинстве случаев.
  • Поддержка прямой работы с большими файлами через параметр chunksize.
  • Возможность сразу выполнять фильтрацию и агрегирование данных.

Если требуется контролировать загрузку и обработку вручную, используют requests:

import requests
import csv
from io import StringIO
url = "https://example.com/data.csv"
response = requests.get(url)
response.raise_for_status()  # проверка успешности запроса
file_like = StringIO(response.text)
reader = csv.reader(file_like)
for row in reader:
print(row)

Рекомендации при работе с CSV по URL:

  1. Использовать response.raise_for_status() для обработки ошибок HTTP.
  2. Проверять кодировку: при проблемах с кириллицей можно передать encoding="utf-8-sig" в pd.read_csv или StringIO(response.content.decode("utf-8-sig")).
  3. Для больших файлов применять потоковую обработку через chunksize или библиотеку csv с генератором.
  4. При необходимости авторизации или токенов добавлять заголовки в запрос через headers в requests.get.

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

Вопрос-ответ:

Ссылка на основную публикацию