0Pricing
AI Agents · Lezione

Lettura e scrittura dei file nel contesto degli agenti

open(), pathlib.Path e lettura di file CSV/JSON/TXT dagli strumenti degli agenti

Lettura e scrittura dei file nel contesto degli agenti è una lezione AI Agents gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Agents, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Agents include 4 lezioni in totale.

Perché l'I/O sui file è importante per gli agenti

Gli agenti devono spesso leggere la configurazione, memorizzare risultati intermedi e scrivere report di output. Python offre due modi principali per lavorare con i file: la funzione integrata open() e il moderno modulo pathlib. È essenziale conoscere entrambi.

Ogni operazione sui file dovrebbe utilizzare un gestore di contesto, cioè un'istruzione with, per assicurarsi che il file venga chiuso anche in caso di errore.

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)

Lettura dei file con open()

La funzione open() accetta un nome file e una modalità. Per leggere testo, utilizzi la modalità 'r'. È possibile leggere l'intero file in una volta con .read(), riga per riga con .readline() oppure tutte le righe in una lista con .readlines().

Specifichi sempre encoding='utf-8' per evitare problemi di codifica specifici della piattaforma.

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)

Scrittura dei file con open()

Utilizzi la modalità 'w' per scrivere, creando o sovrascrivendo il file, 'a' per aggiungere contenuti e 'x' per creare il file in modo esclusivo, con errore se il file esiste già. La modalità 'w' tronca prima il file: presti attenzione ai dati esistenti.

# 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 — Operazioni moderne sui file

pathlib.Path offre un approccio orientato agli oggetti per gestire i percorsi dei file. È più leggibile di os.path e gestisce automaticamente i separatori dei percorsi tra piattaforme diverse. Per semplici operazioni di lettura e scrittura, read_text() e write_text() sono l'approccio più chiaro.

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')

Lettura e scrittura di file JSON

Gli agenti scambiano spesso dati strutturati sotto forma di file JSON. Utilizzi json.load() per analizzare un file JSON e json.dump() per scriverne uno. Utilizzi sempre indent=2 per ottenere un output leggibile e ensure_ascii=False per preservare i caratteri Unicode.

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')

Context manager — Il modo corretto

L'istruzione with (context manager) garantisce che il file venga chiuso quando si esce dal blocco, anche se si verifica un'eccezione durante la lettura. Senza di essa, i file possono rimanere aperti e causare perdite di descrittori di file, provocando arresti anomali sui sistemi con limiti sul numero di handle aperti.

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)

Utilizzo dei file binari

Utilizzi la modalità 'rb' per leggere file binari (immagini, PDF, audio) e 'wb' per scriverli. Non tenti mai di decodificare il contenuto binario come testo: utilizzi read_bytes()/write_bytes() con pathlib oppure le modalità binarie con 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)

Gestione della codifica e dei caratteri di nuova riga

Sistemi diversi utilizzano caratteri di nuova riga diversi (\n su Linux/macOS, \r\n su Windows). Specifichi sempre encoding='utf-8' e lasci che Python gestisca i caratteri di nuova riga con newline=None (il valore predefinito). Per i file con un BOM (byte order mark), utilizzi 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))

Elaborazione efficiente riga per riga

Per i file di grandi dimensioni (file di log, dataset), eviti di caricare tutto in memoria con .read(). Iteri direttamente sull'oggetto file: Python legge una riga alla volta, mantenendo costante l'utilizzo della memoria indipendentemente dalle dimensioni del file.

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')

Creazione e gestione delle directory

Prima di scrivere i file, verifichi che la directory principale esista. Utilizzi Path.mkdir(parents=True, exist_ok=True) per creare directory annidate senza errori se esistono già. Questo è un passaggio di configurazione comune all'inizio di qualsiasi agente che produca file di output.

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')

Buone pratiche per i percorsi dei file negli agenti

Gli agenti dovrebbero utilizzare percorsi assoluti oppure percorsi relativi a una directory di base ben definita. Non faccia mai affidamento sulla directory di lavoro corrente (./), perché gli agenti vengono spesso avviati da posizioni diverse. Utilizzi Path(__file__).parent per ottenere la directory dello script da usare come base.

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)

Verifica rapida: context manager

Verifichi la propria comprensione delle buone pratiche per l'I/O sui file.

Riepilogo dell'I/O sui file

Ora dispone di solide basi per le operazioni sui file nel codice degli agenti:

  • Utilizzi open('file', 'r', encoding='utf-8') per leggere, 'w' per scrivere e 'a' per aggiungere contenuti
  • Utilizzi sempre l'istruzione with per assicurarsi che i file vengano chiusi
  • pathlib.Path offre una gestione chiara e indipendente dalla piattaforma dei percorsi, con read_text()/write_text()
  • Utilizzi json.load(f) / json.dump(data, f, indent=2) per i dati strutturati
  • Per i file di grandi dimensioni, li elabori riga per riga per ridurre al minimo l'uso della memoria
  • Utilizzi Path(__file__).parent come directory di base: non faccia mai affidamento sulla cwd

Domande Frequenti

La lezione «Lettura e scrittura dei file nel contesto degli agenti» è gratuita?

Sì — il testo completo di «Lettura e scrittura dei file nel contesto degli agenti» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Agents, passa a CoddyKit PRO. Il corso AI Agents include 4 lezioni in totale.

Cosa imparerò in «Lettura e scrittura dei file nel contesto degli agenti»?

open(), pathlib.Path e lettura di file CSV/JSON/TXT dagli strumenti degli agenti Eserciti AI Agents con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare AI Agents?

Non è richiesta alcuna esperienza precedente. AI Agents su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Lettura e scrittura dei file nel contesto degli agenti»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione AI Agents?

Sì. Ogni lezione AI Agents include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Lettura e scrittura dei file nel contesto degli agenti
  2. Attraversamento delle directory e ricerca dei file
  3. Gestione dei formati file: CSV, JSON e TXT
  4. Operazioni sicure sui file con gestione degli errori
← Torna a AI Agents