Модуль 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).
Поздравляем!
Вы прошли модуль "Работа с файлами" в Python. Теперь вы знаете, как работать с текстовыми, JSON, CSV и бинарными файлами для эффективного хранения и обработки данных!