Чтение и запись файлов в контексте агента
open(), pathlib.Path, чтение файлов CSV/JSON/TXT из инструментов агента.
«Чтение и запись файлов в контексте агента» — бесплатный урок AI Agents на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.
Почему операции с файлами важны для агентов
Агентам часто нужно читать конфигурацию, сохранять промежуточные результаты и записывать отчёты. Python предоставляет два основных способа работы с файлами: встроенную функцию открытия open() и современный модуль для работы с путями. Важно знать оба способа.
Каждая операция с файлом должна использовать менеджер контекста (инструкцию with), чтобы файл был закрыт даже при возникновении ошибки.
with open('config.txt', 'w', encoding='utf-8') as f:
f.write('model=gpt-4o-mini\nmax_steps=20\n')
with open('config.txt', 'r', encoding='utf-8') as f:
content = f.read()
from pathlib import Path
content = Path('config.txt').read_text(encoding='utf-8')
print(content)Чтение файлов с помощью функции открытия
Функция open() принимает имя файла и режим. Для чтения текста используйте режим 'r'. Весь файл можно прочитать сразу с помощью .read(), построчно — с помощью .readline(), а все строки получить в виде списка — с помощью .readlines().
Всегда явно указывайте encoding='utf-8', чтобы избежать неожиданностей, связанных с кодировкой на разных платформах.
with open('report.txt', 'w', encoding='utf-8') as f:
f.write('Quarterly agent report body text.')
with open('large_log.txt', 'w', encoding='utf-8') as f:
f.write('INFO: started\nERROR: timeout\nINFO: done\n')
with open('tasks.txt', 'w', encoding='utf-8') as f:
f.write('task one\ntask two\n')
with open('report.txt', 'r', encoding='utf-8') as f:
full_text = f.read()
print(f'Read {len(full_text)} characters')
with open('large_log.txt', 'r', encoding='utf-8') as f:
for line in f:
line = line.rstrip('\n')
if 'ERROR' in line:
print('Found error:', line)
with open('tasks.txt', 'r', encoding='utf-8') as f:
tasks = f.readlines()
tasks = [t.strip() for t in tasks]
print('Tasks:', tasks)Запись файлов с помощью функции открытия
Используйте режим 'w' для записи (он создаёт файл или перезаписывает его), 'a' для добавления данных и 'x' для эксклюзивного создания (операция завершается ошибкой, если файл уже существует). Режим 'w' сначала очищает файл — будьте осторожны с существующими данными.
# Write a new file (or overwrite)
results = ['Task 1 complete', 'Task 2 complete', 'Task 3 failed']
with open('results.txt', 'w', encoding='utf-8') as f:
for result in results:
f.write(result + '\n')
# Append to existing file (add without overwriting)
with open('agent_log.txt', 'a', encoding='utf-8') as f:
f.write('2026-05-29 14:30: Agent completed batch\n')
# Create exclusively — error if file already exists
try:
with open('unique_report.txt', 'x', encoding='utf-8') as f:
f.write('This file is new')
except FileExistsError:
print('File already exists, skipping')
# --- demo ---
print('results.txt contents:')
with open('results.txt', encoding='utf-8') as f:
print(f.read())
# Try the exclusive create again now that the file exists
try:
with open('unique_report.txt', 'x', encoding='utf-8') as f:
f.write('This file is new')
except FileExistsError:
print('File already exists, skipping')
pathlib.Path — современные операции с файлами
pathlib.Path предоставляет объектно-ориентированный подход к работе с путями к файлам. Этот подход более понятен, чем os.path, а разделители путей для разных платформ обрабатываются автоматически. Для простых операций чтения и записи наиболее аккуратным решением будут read_text() и write_text().
from pathlib import Path
base = Path('agent_workspace')
base.mkdir(exist_ok=True)
config_file = base / 'config.json'
config_file.write_text('{"model": "gpt-4o-mini"}', encoding='utf-8')
if config_file.exists():
content = config_file.read_text(encoding='utf-8')
print('Config:', content)
output = base / 'output' / 'report.txt'
output.parent.mkdir(parents=True, exist_ok=True)
output.write_text('Agent report\nLine 2', encoding='utf-8')
Path('image.png').write_bytes(b'\x89PNG\r\n\x1a\n' + bytes(range(100)))
binary_data = Path('image.png').read_bytes()
print(f'File size: {len(binary_data)} bytes')Чтение и запись JSON-файлов
Агенты часто обмениваются структурированными данными в виде JSON-файлов. Используйте json.load(), чтобы разобрать JSON-файл, и json.dump(), чтобы записать его. Для удобного чтения человеком всегда используйте indent=2, а для сохранения символов Юникода — ensure_ascii=False.
import json
from pathlib import Path
config_path = Path('agent_config.json')
config_path.write_text(json.dumps({'max_retries': 5, 'model': 'gpt-4o-mini'}), encoding='utf-8')
with open(config_path, 'r', encoding='utf-8') as f:
config = json.load(f)
print('Max retries:', config.get('max_retries', 3))
print('Model:', config.get('model', 'gpt-4o-mini'))
results = {
'run_id': 'run-001',
'status': 'completed',
'items_processed': 142,
'errors': []
}
with open('results.json', 'w', encoding='utf-8') as f:
json.dump(results, f, indent=2, ensure_ascii=False)
print('Results written to results.json')Менеджеры контекста — правильный подход
Инструкция with (менеджер контекста) гарантирует закрытие файла при выходе из блока — даже если в середине чтения возникает исключение. Без неё файлы могут оставаться открытыми, а файловые дескрипторы — не освобождаться, что приводит к сбоям в системах с ограниченным числом дескрипторов файлов.
with open('data.txt', 'w', encoding='utf-8') as f:
f.write('sample content')
f = open('data.txt', 'r')
try:
content = f.read()
finally:
f.close()
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read()
with open('input.txt', 'w', encoding='utf-8') as f:
f.write('hello\nworld\n')
with open('input.txt', 'r') as infile, \
open('output.txt', 'w') as outfile:
for line in infile:
processed = line.upper()
outfile.write(processed)
print('Done:', content)Работа с двоичными файлами
Используйте режим 'rb' для чтения двоичных файлов (изображений, PDF-файлов, аудио) и 'wb' для их записи. Никогда не пытайтесь декодировать двоичное содержимое как текст — используйте read_bytes()/write_bytes() с pathlib или двоичные режимы с open().
from pathlib import Path
import base64
image_path = Path('screenshot.png')
image_path.write_bytes(b'\x89PNG\r\n\x1a\n' + bytes(range(50)))
image_bytes = image_path.read_bytes()
print(f'Image size: {len(image_bytes)} bytes')
image_b64 = base64.b64encode(image_bytes).decode('utf-8')
print(f'Base64 length: {len(image_b64)}')
response_bytes = b'...binary content from API...'
output_path = Path('output') / 'generated_image.png'
output_path.parent.mkdir(exist_ok=True)
output_path.write_bytes(response_bytes)
print('Wrote', output_path)Обработка проблем с кодировкой и символами новой строки
В разных системах используются разные символы новой строки (\n в Linux/macOS и \r\n в Windows). Всегда явно указывайте encoding='utf-8', а обработку символов новой строки поручайте Python с помощью newline=None (значение по умолчанию). Для файлов с BOM (маркером порядка байтов) используйте encoding='utf-8-sig'.
with open('data.txt', 'w', encoding='utf-8') as f:
f.write('hello world')
with open('windows_export.csv', 'wb') as f:
f.write('name,email\n'.encode('utf-8'))
with open('unknown_encoding.txt', 'wb') as f:
f.write('cafe resume'.encode('latin-1'))
with open('data.txt', 'r', encoding='utf-8') as f:
text = f.read()
with open('windows_export.csv', 'r', encoding='utf-8-sig') as f:
content = f.read()
try:
with open('unknown_encoding.txt', 'r', encoding='utf-8') as f:
text = f.read()
except UnicodeDecodeError:
with open('unknown_encoding.txt', 'r',
encoding='utf-8', errors='replace') as f:
text = f.read()
print('Warning: file had encoding errors (replaced with ?)')
print('All reads completed. csv content:', repr(content))Эффективная построчная обработка
Для больших файлов (файлов журналов, наборов данных) не загружайте всё содержимое в память с помощью .read(). Перебирайте объект файла напрямую — Python считывает по одной строке за раз, поэтому потребление памяти остаётся постоянным независимо от размера файла.
from pathlib import Path
def process_large_log(log_path):
error_count = 0
processed = 0
with open(log_path, 'r', encoding='utf-8') as f:
for line in f: # reads one line at a time
line = line.strip()
if not line:
continue
processed += 1
if '[ERROR]' in line:
error_count += 1
# Process error immediately without storing all lines
handle_error(line)
print(f'Processed {processed} lines, {error_count} errors')
def handle_error(line):
print(f'Error found: {line[:80]}')
# --- demo ---
with open('demo_agent.log', 'w', encoding='utf-8') as f:
f.write('[INFO] agent started\n')
f.write('[ERROR] timeout calling tool search_web\n')
f.write('[INFO] retrying\n')
f.write('[ERROR] tool search_web failed again\n')
process_large_log('demo_agent.log')
Создание каталогов и управление ими
Перед записью файлов убедитесь, что родительский каталог существует. Используйте Path.mkdir(parents=True, exist_ok=True), чтобы создавать вложенные каталоги без ошибок, если они уже существуют. Это распространённый шаг настройки в начале работы любого агента, создающего выходные файлы.
from pathlib import Path
import datetime
# Create output directory structure
today = datetime.date.today().isoformat() # '2026-05-29'
output_dir = Path('agent_output') / today / 'reports'
output_dir.mkdir(parents=True, exist_ok=True)
print(f'Output directory: {output_dir}')
# Now write files safely
for i in range(3):
report_path = output_dir / f'report_{i:02d}.json'
report_path.write_text(
'{"status": "ok"}',
encoding='utf-8'
)
# List all created files
for f in output_dir.iterdir():
print(f' {f.name}: {f.stat().st_size} bytes')Рекомендации по работе агентов с путями к файлам
Агентам следует использовать абсолютные пути или пути относительно чётко определённого базового каталога. Никогда не полагайтесь на текущий рабочий каталог (./), поскольку агентов часто запускают из разных мест. Используйте Path(__file__).parent, чтобы получить каталог скрипта в качестве базового.
from pathlib import Path
# Get absolute path relative to THIS script's location
SCRIPT_DIR = Path(__file__).parent
DATA_DIR = SCRIPT_DIR / 'data'
OUTPUT_DIR = SCRIPT_DIR / 'output'
# Always resolve to absolute path before use
config = DATA_DIR / 'config.json'
print('Config path:', config.resolve())
# Check if file exists before reading
if config.exists():
import json
with open(config, 'r', encoding='utf-8') as f:
settings = json.load(f)
else:
print(f'Config not found at {config.resolve()}')
settings = {}
# Safe output path
result_path = (OUTPUT_DIR / 'result.json').resolve()
print('Will write to:', result_path)Быстрая проверка: менеджеры контекста
Проверьте, насколько хорошо Вы поняли рекомендации по операциям ввода-вывода с файлами.
Повторение операций ввода-вывода с файлами
Теперь у Вас есть прочная основа для выполнения операций с файлами в коде агентов:
- Используйте
open('file', 'r', encoding='utf-8')для чтения,'w'для записи и'a'для добавления - Всегда используйте оператор with, чтобы файлы закрывались
- pathlib.Path обеспечивает удобную работу с путями на разных платформах с помощью
read_text()/write_text() - Используйте
json.load(f)/json.dump(data, f, indent=2)для структурированных данных - Для больших файлов перебирайте строки по одной, чтобы минимизировать использование памяти
- Используйте
Path(__file__).parentкак базовый каталог — никогда не полагайтесь на текущий рабочий каталог
Часто задаваемые вопросы
Урок «Чтение и запись файлов в контексте агента» бесплатный?
Да — полный текст урока «Чтение и запись файлов в контексте агента» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.
Чему я научусь в уроке «Чтение и запись файлов в контексте агента»?
open(), pathlib.Path, чтение файлов CSV/JSON/TXT из инструментов агента. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Agents?
Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Чтение и запись файлов в контексте агента»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Agents?
Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Чтение и запись файлов в контексте агента
- Обход каталогов и поиск файлов
- Работа с форматами файлов: CSV, JSON и TXT
- Безопасные операции с файлами и обработка ошибок