Gestione dei formati file: CSV, JSON e TXT
Modulo csv, json.load/dump e codifica sicura del testo per gli strumenti degli agenti
Gestione dei formati file: CSV, JSON e TXT è una lezione AI Agents gratuita su CoddyKit. Questa è la lezione 3 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.
I tre formati di file più comuni per gli agenti
Gli agenti leggono e scrivono continuamente tre formati di file: CSV per i dati tabellari, JSON per gli oggetti strutturati e testo semplice per log, prompt e report. Ognuno presenta requisiti di analisi, casi limite e buone pratiche diversi. Python offre un eccellente supporto integrato per tutti e tre.
import csv
import json
from pathlib import Path
# Detect format from extension
def read_data_file(file_path):
path = Path(file_path)
if path.suffix == '.csv':
return read_csv(path)
elif path.suffix == '.json':
return read_json(path)
elif path.suffix == '.txt':
return path.read_text(encoding='utf-8')
else:
raise ValueError(f'Unsupported format: {path.suffix}')csv.reader — Analisi di base dei CSV
csv.reader analizza un file CSV riga per riga, restituendo ogni riga come elenco di stringhe. Gestisce correttamente i campi tra virgolette, le virgole incorporate e i caratteri di nuova riga all'interno dei valori tra virgolette, a differenza della divisione manuale sulle virgole, che non gestisce correttamente i casi limite.
import csv
with open('sales.csv', 'w', newline='') as f:
f.write('product,qty,price\nWidget,3,9.99\nGadget,1,19.99\n')
with open('sales.csv', 'r', encoding='utf-8', newline='') as f:
reader = csv.reader(f)
header = next(reader)
print('Columns:', header)
for row in reader:
product = row[0]
quantity = int(row[1])
price = float(row[2])
print(f'{product}: {quantity} units at ${price}')csv.DictReader — Riga come dizionario
csv.DictReader legge ogni riga come un OrderedDict (o come un normale dict in Python 3.8 e versioni successive), usando le intestazioni delle colonne come chiavi. È molto più semplice da usare rispetto all'accesso tramite indice posizionale: il codice rimane leggibile anche se l'ordine delle colonne cambia.
import csv
with open('employees.csv', 'w', newline='') as f:
f.write('name,department,salary\nAlice,Eng,95000\nBob,Sales,70000\n')
with open('employees.csv', 'r', encoding='utf-8', newline='') as f:
reader = csv.DictReader(f)
print('Fields:', reader.fieldnames)
total_salary = 0
for row in reader:
name = row['name']
department = row['department']
salary = float(row['salary'])
total_salary += salary
print(f'{name} ({department}): ${salary:,.2f}')
print(f'Total payroll: ${total_salary:,.2f}')csv.writer e DictWriter — Scrittura dei CSV
Utilizzi csv.writer per scrivere righe sotto forma di elenchi oppure csv.DictWriter per scrivere righe sotto forma di dict. Quando apre il file, passi sempre newline='': il modulo csv gestisce autonomamente i caratteri di fine riga per evitare righe vuote doppie su Windows.
import csv
results = [
{'task_id': 'T001', 'status': 'completed', 'duration_s': 12.5},
{'task_id': 'T002', 'status': 'failed', 'duration_s': 3.1},
{'task_id': 'T003', 'status': 'completed', 'duration_s': 45.8},
]
fieldnames = ['task_id', 'status', 'duration_s']
with open('task_results.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() # write column names
writer.writerows(results)
print('Wrote task_results.csv')json.load() e json.dump() — I/O sui file
Utilizzi json.load(file) per analizzare un file JSON e json.dump(obj, file) per scriverne uno. Queste funzioni lavorano con oggetti file. Utilizzi json.loads(string) e json.dumps(obj) per le stringhe. Utilizzi sempre indent=2 per ottenere un output leggibile.
import json
with open('config.json', 'w', encoding='utf-8') as f:
json.dump({'api_url': 'https://api.example.com', 'timeout': 15}, f)
with open('config.json', 'r', encoding='utf-8') as f:
config = json.load(f)
print('API URL:', config.get('api_url'))
print('Timeout:', config.get('timeout', 30))
output_data = {
'run_id': 'abc123',
'items': [1, 2, 3],
'meta': {'agent': 'v2', 'model': 'gpt-4o'}
}
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(
output_data, f,
indent=2,
ensure_ascii=False
)
print('Written output.json')Gestione degli errori di decodifica JSON
Nei flussi di lavoro degli agenti, i file JSON malformati sono comuni: scritture incomplete, download troncati o problemi di codifica. Racchiuda sempre json.load() in un blocco try/except e fornisca messaggi di errore chiari che includano il percorso del file per facilitare il debug.
import json
from pathlib import Path
def safe_load_json(file_path):
path = Path(file_path)
try:
with open(path, 'r', encoding='utf-8') as f:
return json.load(f)
except json.JSONDecodeError as e:
print(f'Invalid JSON in {path}: line {e.lineno}, col {e.colno}')
print(f' Error: {e.msg}')
# Show the problem area
content = path.read_text(encoding='utf-8')
lines = content.split('\n')
if e.lineno <= len(lines):
print(f' Content: {lines[e.lineno-1][:80]}')
return None
except FileNotFoundError:
print(f'File not found: {path}')
return None
# --- demo ---
Path('good.json').write_text('{"model": "gpt-4o"}', encoding='utf-8')
Path('bad.json').write_text('{"model": "gpt-4o", }', encoding='utf-8')
print('Loading good.json:', safe_load_json('good.json'))
print('Loading bad.json:', safe_load_json('bad.json'))
Lettura del formato JSONL (JSON Lines)
Molte API di IA e pipeline di dati utilizzano JSONL (JSON Lines), con un oggetto JSON per riga. Questo formato supporta lo streaming ed è facile da elaborare riga per riga senza caricare l'intero file in memoria. Ogni riga è un oggetto JSON completo e autonomo.
import json
with open('events.jsonl', 'w', encoding='utf-8') as f:
f.write('{"event": "start"}\n{"event": "stop"}\nnot json\n')
results = []
with open('events.jsonl', 'r', encoding='utf-8') as f:
for line_num, line in enumerate(f, 1):
line = line.strip()
if not line:
continue
try:
event = json.loads(line)
results.append(event)
except json.JSONDecodeError as e:
print(f'Bad JSON on line {line_num}: {e}')
print(f'Loaded {len(results)} events')
with open('output.jsonl', 'w', encoding='utf-8') as f:
for record in results:
f.write(json.dumps(record, ensure_ascii=False) + '\n')Lettura dei file di testo semplice
Il testo semplice è il formato più essenziale: log, prompt, report e file di configurazione. Legga l'intero file con .read() oppure lo elabori riga per riga. Per i file di grandi dimensioni, utilizzi sempre l'approccio riga per riga per mantenere costante l'uso della memoria.
from pathlib import Path
Path('system_prompt.txt').write_text('You are a helpful agent.', encoding='utf-8')
with open('agent.log', 'w', encoding='utf-8') as f:
f.write('INFO: boot\nERROR: disk full\nCRITICAL: crash\nINFO: recovered\n')
prompt = Path('system_prompt.txt').read_text(encoding='utf-8')
print(f'Prompt length: {len(prompt)} characters')
error_lines = []
with open('agent.log', 'r', encoding='utf-8') as f:
for line in f:
line = line.rstrip()
if not line:
continue
if 'ERROR' in line or 'CRITICAL' in line:
error_lines.append(line)
print(f'Found {len(error_lines)} error lines')
with open('summary.txt', 'w', encoding='utf-8') as f:
f.write('Agent Run Summary\n')
f.write('=' * 40 + '\n')
for error in error_lines[:10]:
f.write(f' {error}\n')
print('Summary written')Gestione del BOM (Byte Order Mark)
I file esportati da Excel o dagli strumenti Windows spesso iniziano con un BOM (Byte Order Mark), ovvero un carattere invisibile \ufeff. Se non viene gestito, altera il nome del primo campo durante l'analisi dei CSV. Utilizzi encoding='utf-8-sig' per rimuoverlo automaticamente.
import csv
with open('windows_export.csv', 'wb') as f:
f.write('name,email,age\nAlice,alice@x.com,30\n'.encode('utf-8'))
with open('file.txt', 'wb') as f:
f.write(b'\xef\xbb\xbfhello')
with open('windows_export.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
first = next(reader)
print(list(first.keys()))
with open('windows_export.csv', 'r', encoding='utf-8-sig') as f:
reader = csv.DictReader(f)
first = next(reader)
print(list(first.keys()))
content = open('file.txt', 'rb').read()
if content.startswith(b'\xef\xbb\xbf'):
content = content[3:]
text = content.decode('utf-8')
print('Decoded:', text)Gestione degli errori di codifica
Quando legge file provenienti da fonti sconosciute, gli errori di codifica sono comuni. Il parametro errors di open() controlla il comportamento: 'replace' sostituisce i caratteri non validi con ?, 'ignore' li rimuove e 'backslashreplace' li rappresenta tramite escape. Per una validazione rigorosa, utilizzi 'strict' (il valore predefinito).
from pathlib import Path
def read_with_fallback(file_path):
path = Path(file_path)
# Try UTF-8 first
try:
return path.read_text(encoding='utf-8')
except UnicodeDecodeError:
pass
# Try Latin-1 (handles most European files)
try:
return path.read_text(encoding='latin-1')
except UnicodeDecodeError:
pass
# Last resort: replace bad characters
text = path.read_text(encoding='utf-8', errors='replace')
print(f'Warning: {path.name} had encoding errors (chars replaced)')
return text
# --- demo ---
Path('notes_utf8.txt').write_text('Notes: café, naïve, résumé', encoding='utf-8')
text = read_with_fallback('notes_utf8.txt')
print(f'Read {len(text)} chars: {text!r}')
Gestione dei file CSV malformati
I file CSV del mondo reale presentano spesso problemi: virgole in eccesso, campi mancanti, uso incoerente delle virgolette o delimitatori misti. Utilizzi le opzioni quoting e error_bad_lines e racchiuda l'analisi delle righe in un blocco try/except per ignorare le righe problematiche in modo appropriato.
import csv
with open('messy_data.csv', 'w', newline='') as f:
f.write('name,email,score\nAlice,alice@x.com,88\nBob,,90\nCarol,carol@x.com,notanumber\n')
valid_rows = []
error_count = 0
with open('messy_data.csv', 'r', encoding='utf-8', newline='') as f:
reader = csv.DictReader(f)
expected_fields = {'name', 'email', 'score'}
for line_num, row in enumerate(reader, start=2):
try:
if not all(row.get(f, '').strip() for f in expected_fields):
raise ValueError(f'Missing required field in row {line_num}')
score = float(row['score'])
valid_rows.append({
'name': row['name'].strip(),
'email': row['email'].strip().lower(),
'score': score
})
except (ValueError, KeyError) as e:
error_count += 1
print(f'Skipping row {line_num}: {e}')
print(f'Valid: {len(valid_rows)}, Errors: {error_count}')Verifica rapida: CSV DictReader e reader
Verifichi la propria comprensione delle opzioni per l'analisi dei CSV.
Riepilogo della gestione dei formati di file
Ora è in grado di analizzare e scrivere tutti i principali formati di file utilizzati dagli agenti:
- CSV: utilizzi
csv.DictReaderper le righe come dict ecsv.DictWriterper l'output; specifichi semprenewline=''all'apertura - JSON: utilizzi
json.load(f)per l'analisi ejson.dump(obj, f, indent=2)per la scrittura; intercettiJSONDecodeError - JSONL: legga e analizzi ogni riga con
json.loads(line); è ideale per i dati in streaming - Testo semplice: utilizzi
.read()per i file piccoli e l'iterazione riga per riga per quelli grandi - BOM: utilizzi
encoding='utf-8-sig'per i file esportati da Windows - Errori di codifica: provi UTF-8, ripieghi su latin-1 oppure utilizzi
errors='replace'
Impara AI Agents con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 60
- Lezioni
- 239
Domande Frequenti
La lezione «Gestione dei formati file: CSV, JSON e TXT» è gratuita?
Sì — il testo completo di «Gestione dei formati file: CSV, JSON e TXT» è 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 «Gestione dei formati file: CSV, JSON e TXT»?
Modulo csv, json.load/dump e codifica sicura del testo per gli 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 3 di 4.
Quanto tempo richiede la lezione «Gestione dei formati file: CSV, JSON e TXT»?
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
- Lettura e scrittura dei file nel contesto degli agenti
- Attraversamento delle directory e ricerca dei file
- Gestione dei formati file: CSV, JSON e TXT
- Operazioni sicure sui file con gestione degli errori