CSV (Comma-Separated Values) файлы – это текстовые файлы, предназначенные для представления табличных данных. Они широко используются в различных областях, таких как аналитика данных, интернет-маркетинг и веб-программирование. Парсинг CSV без использования модуля csv может быть полезен для изучения низкоуровневых аспектов работы с файлами или для большей гибкости в обработке данных.
Основы работы с файлами в Python
Открытие и чтение файлов
Открытие файла в Python осуществляется с помощью встроенной функции open().
def open_file(file_path: str) -> 'TextIO':
"""
Открывает файл для чтения и возвращает файловый объект.
:param file_path: Путь к файлу.
:return: Файловый объект.
"""
return open(file_path, 'r', encoding='utf-8')
Чтение строк
Для чтения строк файла используем метод readlines(), который возвращает список строк.
def read_lines(file_obj: 'TextIO') -> list[str]:
"""
Читает все строки из файла.
:param file_obj: Файловый объект.
:return: Список строк.
"""
return file_obj.readlines()
Закрытие файлов
Всегда закрывайте файлы после их использования для освобождения системных ресурсов. В этом помогает контекстный менеджер.
def read_file(file_path: str) -> list[str]:
"""
Читает файл и возвращает список строк.
:param file_path: Путь к файлу.
:return: Список строк.
"""
with open(file_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
return lines
Формат CSV
Структура CSV файла
CSV файлы представляют данные в виде строк текста, где каждая строка содержит одно или несколько полей, разделенных запятыми или другими разделителями (например, точкой с запятой). Поле может содержать текстовые данные, числа или даты, а первая строка файла часто используется для заголовков колонок.
Пример CSV:
Name,Age,Occupation
Alice,30,Engineer
Bob,25,Designer
Чтение CSV файла без импорта модуля csv
Использование readlines() для парсинга
Прочитаем CSV файл и разобьем его на элементы при помощи readlines().
def parse_csv(file_path: str) -> list[list[str]]:
"""
Читает CSV файл и разбивает строки на элементы.
:param file_path: Путь к CSV файлу.
:return: Двумерный список данных.
"""
lines = read_file(file_path)
data: list[list[str]] = []
for line in lines:
data.append(line.strip().split(','))
return data
Применение метода split()
Метод split() помогает разбить строку на отдельные элементы по заданному разделителю.
def split_line(line: str, delimiter: str = ',') -> list[str]:
"""
Разбивает строку на элементы по указанному разделителю.
:param line: Строка для разбивки.
:param delimiter: Разделитель.
:return: Список элементов.
"""
return line.strip().split(delimiter)
Обработка и хранение данных
Для хранения данных используйте списки или словари. Ниже пример использования списков с типизацией.
def store_data(file_path: str) -> list[dict[str, str]]:
"""
Читает CSV файл и сохраняет данные в виде списка словарей.
:param file_path: Путь к CSV файлу.
:return: Список словарей с данными.
"""
data = parse_csv(file_path)
headers = data[0]
records: list[dict[str, str]] = []
for row in data[1:]:
record = {header: value for header, value in zip(headers, row)}
records.append(record)
return records
Преимущества и недостатки
Преимущества чтения без модуля
- Гибкость: Возможность более гибкой обработки данных.
- Меньше зависимостей: Не требуется установка дополнительных библиотек.
- Учебная ценность: Помогает лучше понять внутреннюю работу с файлами и строками.
Недостатки
- Ошибки: Больше шансов на ошибки при парсинге.
- Сложность: Более сложная обработка больших файлов или файлов с нестандартными разделителями.
Практический пример: Чтение данных из CSV и их анализ
Подготовка данных
Создадим простой CSV файл с данными для анализа:
name,age,salary
Alice,30,70000
Bob,25,50000
Charlie,35,120000
Чтение и анализ данных
Прочитаем файл и посчитаем средний возраст и зарплату.
from typing import Tuple
def analyze_data(file_path: str) -> Tuple[float, float]:
"""
Анализ данных из CSV файла. Возвращает средний возраст и зарплату.
:param file_path: Путь к CSV файлу.
:return: Кортеж (средний возраст, средняя зарплата).
"""
data = store_data(file_path)
total_age = sum(int(record['age']) for record in data)
total_salary = sum(float(record['salary']) for record in data)
avg_age = total_age / len(data)
avg_salary = total_salary / len(data)
return avg_age, avg_salary
file_path = 'data.csv'
average_age, average_salary = analyze_data(file_path)
print(f"Средний возраст: {average_age}")
print(f"Средняя зарплата: {average_salary}")
Заключение
Мы рассмотрели, как прочитать и обработать CSV файл без использования модуля csv, используя встроенные возможности Python. Это подход дает большую гибкость, но требует больше усилий и внимания к деталям. Изучив этот метод, вы сможете лучше понять работу с файлами и строками в Python.