Как прочитать CSV файл на Python без импорта модуля csv?

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

Преимущества и недостатки

Преимущества чтения без модуля

  1. Гибкость: Возможность более гибкой обработки данных.
  2. Меньше зависимостей: Не требуется установка дополнительных библиотек.
  3. Учебная ценность: Помогает лучше понять внутреннюю работу с файлами и строками.

Недостатки

  1. Ошибки: Больше шансов на ошибки при парсинге.
  2. Сложность: Более сложная обработка больших файлов или файлов с нестандартными разделителями.

Практический пример: Чтение данных из 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.

References

  1. Официальная документация по встроенным функциям Python
  2. PEP 8 – Рекомендации по стилю написания кода на Python
  3. Python типизация

Добавить комментарий