0Pricing
AI Agents · Урок

Чтение и запись файлов в контексте агента

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 — локальная установка не требуется.

Все уроки этого курса

  1. Чтение и запись файлов в контексте агента
  2. Обход каталогов и поиск файлов
  3. Работа с форматами файлов: CSV, JSON и TXT
  4. Безопасные операции с файлами и обработка ошибок
← Назад к AI Agents