Python

Модуль 6: Работа с файлами

В этом модуле вы изучите различные способы работы с файлами в Python.

6.1 Текстовые файлы

Работа с текстовыми файлами — одна из самых распространенных операций в программировании. Python предоставляет удобные инструменты для чтения, записи и обработки текстовых файлов.

Открытие и закрытие файлов

Для работы с файлами используется функция open(), которая возвращает объект файла. После завершения работы с файлом его необходимо закрыть с помощью метода close().

# Открытие файла для чтения
file = open('example.txt', 'r')
content = file.read()
file.close()

# Более безопасный способ с использованием контекстного менеджера
with open('example.txt', 'r') as file:
    content = file.read()
# Файл автоматически закрывается при выходе из блока with

Режимы открытия файлов

При открытии файла указывается режим, определяющий, какие операции можно выполнять с файлом:

  • 'r' — чтение (режим по умолчанию)
  • 'w' — запись (создает новый файл или перезаписывает существующий)
  • 'a' — добавление (дописывает данные в конец файла)
  • 'x' — эксклюзивное создание (создает файл, возвращает ошибку, если он уже существует)
  • 't' — текстовый режим (по умолчанию)
  • 'b' — бинарный режим
  • '+' — чтение и запись

Чтение текстовых файлов

Python предлагает несколько способов чтения файлов:

# Чтение всего файла в строку
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)

# Чтение файла построчно в список
with open('example.txt', 'r') as file:
    lines = file.readlines()
    for line in lines:
        print(line.strip())  # strip() удаляет символ новой строки

# Построчное чтение с использованием итерации
with open('example.txt', 'r') as file:
    for line in file:
        print(line.strip())

Запись в текстовые файлы

Для записи данных в файл используются методы write() и writelines():

# Запись строки в файл
with open('new_file.txt', 'w') as file:
    file.write('Привет, мир!\n')
    file.write('Это вторая строка.')

# Запись нескольких строк
lines = ['Строка 1\n', 'Строка 2\n', 'Строка 3\n']
with open('multiple_lines.txt', 'w') as file:
    file.writelines(lines)

Кодировка

При работе с файлами, содержащими не-ASCII символы (например, кириллицу), важно указывать правильную кодировку:

# Указание кодировки UTF-8
with open('russian_text.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print(content)

with open('output_russian.txt', 'w', encoding='utf-8') as file:
    file.write('Привет, мир! Это текст на русском языке.')

Позиционирование в файле

Методы seek() и tell() позволяют управлять текущей позицией в файле:

with open('example.txt', 'r') as file:
    # Перемещение указателя на 5 байт от начала файла
    file.seek(5)
    
    # Чтение 10 символов
    content = file.read(10)
    print(content)
    
    # Получение текущей позиции
    position = file.tell()
    print(f'Текущая позиция: {position}')

Практические советы

  • Всегда используйте конструкцию with для работы с файлами — она гарантирует закрытие файла даже при возникновении ошибок.
  • Помните о различиях между операционными системами в отношении символов окончания строки (Windows: \r\n, Unix/Linux: \n). Python может автоматически обрабатывать эти различия при использовании текстового режима.
  • При чтении больших файлов используйте итерацию по строкам или метод read(size), чтобы избежать загрузки всего файла в память.

6.2 JSON и CSV

Для хранения структурированных данных часто используются форматы JSON и CSV. Python предоставляет встроенные модули для работы с этими форматами.

Работа с JSON

JSON (JavaScript Object Notation) — популярный формат обмена данными, который легко читается как человеком, так и машиной. Модуль json в Python позволяет кодировать и декодировать данные в этом формате.

Сериализация (Python → JSON)

import json

# Создаем словарь Python
data = {
    "имя": "Иван",
    "возраст": 30,
    "город": "Москва",
    "языки": ["Python", "JavaScript", "C++"],
    "активен": True,
    "рейтинг": 4.8
}

# Преобразование в строку JSON
json_string = json.dumps(data, ensure_ascii=False, indent=4)
print(json_string)

# Запись в JSON-файл
with open('data.json', 'w', encoding='utf-8') as file:
    json.dump(data, file, ensure_ascii=False, indent=4)

Параметр ensure_ascii=False позволяет сохранять не-ASCII символы в их оригинальном виде, а indent=4 делает вывод более читаемым с помощью отступов.

Десериализация (JSON → Python)

import json

# Чтение JSON из строки
json_string = '{"имя": "Иван", "возраст": 30, "языки": ["Python", "JavaScript"]}'
data = json.loads(json_string)
print(data["имя"])  # Иван

# Чтение из JSON-файла
with open('data.json', 'r', encoding='utf-8') as file:
    loaded_data = json.load(file)
    print(loaded_data)

Соответствие типов данных

При конвертации данных между Python и JSON используются следующие соответствия:

  • Python dict ⟷ JSON Object
  • Python list, tuple ⟷ JSON Array
  • Python str ⟷ JSON String
  • Python int, float ⟷ JSON Number
  • Python True ⟷ JSON true
  • Python False ⟷ JSON false
  • Python None ⟷ JSON null

Работа с CSV

CSV (Comma-Separated Values) — формат для хранения табличных данных в текстовом виде. Для работы с CSV в Python используется модуль csv.

Запись данных в CSV

import csv

# Данные для записи
data = [
    ['Имя', 'Возраст', 'Город'],
    ['Иван', 25, 'Москва'],
    ['Мария', 23, 'Санкт-Петербург'],
    ['Алексей', 30, 'Казань']
]

# Запись в CSV-файл
with open('users.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerows(data)

# Запись словарей в CSV
users = [
    {'Имя': 'Иван', 'Возраст': 25, 'Город': 'Москва'},
    {'Имя': 'Мария', 'Возраст': 23, 'Город': 'Санкт-Петербург'},
    {'Имя': 'Алексей', 'Возраст': 30, 'Город': 'Казань'}
]

with open('users_dict.csv', 'w', newline='', encoding='utf-8') as file:
    fieldnames = ['Имя', 'Возраст', 'Город']
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(users)

Чтение данных из CSV

import csv

# Чтение CSV-файла
with open('users.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

# Чтение CSV-файла в список словарей
with open('users_dict.csv', 'r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(f"{row['Имя']}: {row['Возраст']} лет, город {row['Город']}")

Настройка разделителя и диалекта

CSV файлы могут использовать разные разделители и правила форматирования:

import csv

# Использование точки с запятой в качестве разделителя
with open('data_semicolon.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file, delimiter=';')
    writer.writerow(['Имя', 'Возраст', 'Город'])
    writer.writerow(['Иван', 25, 'Москва'])

# Создание и использование пользовательского диалекта
csv.register_dialect('custom', delimiter='|', quoting=csv.QUOTE_MINIMAL)

with open('data_custom.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file, dialect='custom')
    writer.writerow(['Имя', 'Возраст', 'Город'])
    writer.writerow(['Иван', 25, 'Москва'])

Практические советы по работе с JSON и CSV

  • Используйте параметр ensure_ascii=False при работе с JSON на русском языке.
  • Для CSV всегда указывайте параметр newline='' при открытии файла, чтобы избежать проблем с переносами строк на разных платформах.
  • При работе с большими CSV-файлами используйте построчное чтение, чтобы не загружать весь файл в память.
  • Модуль pandas предоставляет более удобные инструменты для анализа и обработки данных в формате CSV: pd.read_csv() и df.to_csv().

Полезные инструменты

  • JSONLint — онлайн-валидатор JSON
  • JSON Formatter — инструмент для форматирования и валидации JSON
  • CSV Validator — инструмент для проверки CSV-файлов

6.3 Бинарные файлы

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

Открытие и чтение бинарных файлов

Для работы с бинарными файлами используется режим 'b' в сочетании с режимами чтения или записи:

# Чтение бинарного файла
with open('image.jpg', 'rb') as file:
    binary_data = file.read()
    print(f"Размер файла: {len(binary_data)} байт")
    print(f"Первые 10 байт: {binary_data[:10]}")

# Чтение определенного количества байтов
with open('image.jpg', 'rb') as file:
    header = file.read(10)  # Чтение первых 10 байт
    print(header)

Запись бинарных файлов

Для записи бинарных данных используется режим 'wb':

# Запись бинарных данных
with open('output.bin', 'wb') as file:
    file.write(b'\x00\x01\x02\x03\x04')  # Запись байтовой строки
    
    # Запись массива байтов
    import array
    byte_array = array.array('B', [5, 6, 7, 8, 9])
    file.write(byte_array)

# Копирование бинарного файла
with open('image.jpg', 'rb') as source:
    with open('image_copy.jpg', 'wb') as destination:
        destination.write(source.read())

Работа с модулем struct

Модуль struct позволяет упаковывать и распаковывать бинарные данные по определенному формату:

import struct

# Упаковка данных в бинарный формат
# 'i' - целое число (4 байта), 'f' - число с плавающей точкой (4 байта), 's' - строка
data = struct.pack('if10s', 123, 45.67, b'Hello')
print(data)  # b'{\x00\x00\x00\\xd7#B\x00Hello\x00\x00\x00\x00\x00'

# Запись упакованных данных в файл
with open('packed_data.bin', 'wb') as file:
    file.write(data)

# Чтение и распаковка данных
with open('packed_data.bin', 'rb') as file:
    binary_data = file.read()
    unpacked = struct.unpack('if10s', binary_data)
    print(unpacked)  # (123, 45.67, b'Hello\x00\x00\x00\x00\x00')

Работа с модулем pickle

Модуль pickle позволяет сериализовать и десериализовать объекты Python:

import pickle

# Создаем объект для сериализации
data = {
    'name': 'Иван',
    'age': 30,
    'skills': ['Python', 'Data Science'],
    'contacts': {
        'email': 'ivan@example.com',
        'phone': '+7-900-123-45-67'
    }
}

# Сериализация объекта в файл
with open('data.pickle', 'wb') as file:
    pickle.dump(data, file)

# Десериализация объекта из файла
with open('data.pickle', 'rb') as file:
    loaded_data = pickle.load(file)
    print(loaded_data)
    print(f"Имя: {loaded_data['name']}, Возраст: {loaded_data['age']}")

Меры безопасности при работе с pickle

Важно помнить, что модуль pickle не безопасен при работе с ненадежными данными:

  • Никогда не загружайте pickle-файлы из ненадежных источников
  • Pickle может исполнять произвольный код во время загрузки
  • Для обмена данными с внешними системами лучше использовать JSON или другие безопасные форматы

Работа с бинарными файлами изображений

Для работы с изображениями часто используется библиотека Pillow (PIL):

from PIL import Image

# Открытие изображения
image = Image.open('example.jpg')
print(f"Размер изображения: {image.width}x{image.height}")
print(f"Формат: {image.format}")

# Изменение размера и сохранение изображения
resized_image = image.resize((800, 600))
resized_image.save('resized_example.jpg')

# Конвертация между форматами
image.save('example.png')

Работа с zip-архивами

Модуль zipfile позволяет создавать и распаковывать ZIP-архивы:

import zipfile
import os

# Создание ZIP-архива
with zipfile.ZipFile('archive.zip', 'w') as zipf:
    # Добавление файла в архив
    zipf.write('data.json')
    zipf.write('image.jpg')
    
    # Добавление всех текстовых файлов из директории
    for file in os.listdir('.'):
        if file.endswith('.txt'):
            zipf.write(file)

# Распаковка архива
with zipfile.ZipFile('archive.zip', 'r') as zipf:
    # Вывод списка файлов в архиве
    print(zipf.namelist())
    
    # Распаковка всех файлов
    zipf.extractall('extracted_files')
    
    # Извлечение конкретного файла
    zipf.extract('data.json', 'single_file')

Практические советы по работе с бинарными файлами

  • При работе с большими бинарными файлами читайте и обрабатывайте данные порциями, чтобы избежать проблем с памятью.
  • Используйте контекстные менеджеры (with) для автоматического закрытия файлов.
  • Для сложных бинарных форматов (аудио, видео, изображения) используйте специализированные библиотеки, такие как Pillow, OpenCV, PyAudio и др.
  • При работе с сетевыми бинарными данными помните о различиях в порядке байтов (little-endian и big-endian).

Следующие шаги для изучения

  • Изучите библиотеку BytesIO из модуля io для работы с бинарными данными в памяти.
  • Познакомьтесь с библиотекой NumPy для эффективной работы с бинарными массивами данных.
  • Изучите форматы HDF5 и Parquet для работы с большими объемами научных или аналитических данных.

Настройки

Цветовая схема

Тема