Odczyt i zapis plików w kontekście agenta
open(), pathlib.Path oraz odczytywanie plików CSV/JSON/TXT za pomocą narzędzi agenta.
Odczyt i zapis plików w kontekście agenta to bezpłatna lekcja AI Agents na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Agents, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Agents zawiera 4 lekcji w sumie.
Dlaczego operacje na plikach są ważne dla agentów
Agenci często muszą odczytywać konfigurację, zapisywać wyniki pośrednie i tworzyć raporty wyjściowe. Python udostępnia dwa podstawowe sposoby pracy z plikami: wbudowaną funkcję open() i nowoczesny moduł pathlib. Oba warto znać.
Każda operacja na pliku powinna korzystać z menedżera kontekstu (instrukcji with), aby zapewnić zamknięcie pliku nawet w razie wystąpienia błędu.
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)Odczytywanie plików za pomocą open()
Funkcja open() przyjmuje nazwę pliku i tryb. Do odczytu tekstu należy użyć trybu 'r'. Cały plik można odczytać jednocześnie za pomocą .read(), wiersz po wierszu za pomocą .readline() albo wczytać wszystkie wiersze do listy za pomocą .readlines().
Aby uniknąć niespodzianek związanych z kodowaniem zależnym od platformy, należy zawsze określać 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)Zapisywanie plików za pomocą open()
Trybu 'w' należy używać do zapisu (tworzy plik lub zastępuje jego zawartość), trybu 'a' do dopisywania, a trybu 'x' do wyłącznego tworzenia (operacja kończy się niepowodzeniem, jeśli plik już istnieje). Tryb 'w' najpierw skraca plik do zera — należy uważać na istniejące dane.
# 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 — nowoczesna obsługa plików
pathlib.Path zapewnia obiektowe podejście do ścieżek plików. Jest czytelniejszy niż os.path i automatycznie obsługuje separatory ścieżek na różnych platformach. W przypadku prostych operacji odczytu i zapisu najczytelniejszym rozwiązaniem są metody read_text() i 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')Odczytywanie i zapisywanie plików JSON
Agenty często wymieniają dane strukturalne w plikach JSON. Do analizowania pliku JSON należy używać json.load(), a do jego zapisywania — json.dump(). Aby uzyskać wynik czytelny dla człowieka, należy zawsze używać indent=2, a ensure_ascii=False pozwala zachować znaki 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')Menedżery kontekstu — właściwe podejście
Instrukcja with (menedżer kontekstu) gwarantuje zamknięcie pliku po zakończeniu bloku — nawet jeśli w trakcie odczytu wystąpi wyjątek. Bez niej pliki mogą pozostać otwarte i wyczerpywać deskryptory plików, co prowadzi do awarii systemów z limitami uchwytów plików.
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)Praca z plikami binarnymi
Trybu 'rb' należy używać do odczytu plików binarnych (obrazów, plików PDF i dźwięku), a trybu 'wb' do ich zapisu. Nie należy nigdy próbować dekodować zawartości binarnej jako tekstu — z pathlib należy używać read_bytes()/write_bytes(), a z open() trybów binarnych.
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)Obsługa problemów z kodowaniem i znakami nowego wiersza
Różne systemy używają różnych znaków nowego wiersza (\n w systemach Linux/macOS i \r\n w systemie Windows). Należy zawsze określać encoding='utf-8' i pozwolić Pythonowi obsługiwać znaki nowego wiersza za pomocą newline=None (wartość domyślna). W przypadku plików ze znacznikiem BOM (znacznikiem kolejności bajtów) należy użyć 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))Wydajne przetwarzanie wiersz po wierszu
W przypadku dużych plików (plików dziennika i zbiorów danych) należy unikać wczytywania całości do pamięci za pomocą .read(). Należy iterować bezpośrednio po obiekcie pliku — Python odczytuje po jednym wierszu, dzięki czemu zużycie pamięci pozostaje stałe niezależnie od rozmiaru pliku.
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')
Tworzenie katalogów i zarządzanie nimi
Przed zapisaniem plików należy upewnić się, że katalog nadrzędny istnieje. Użycie Path.mkdir(parents=True, exist_ok=True) pozwala utworzyć zagnieżdżone katalogi bez błędów, jeśli już istnieją. Jest to typowy krok konfiguracji wykonywany na początku działania każdego agenta, który tworzy pliki wyjściowe.
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')Najlepsze praktyki dotyczące ścieżek plików w agentach
Agenty powinny używać ścieżek bezwzględnych lub ścieżek względnych względem jasno określonego katalogu bazowego. Nie należy nigdy polegać na bieżącym katalogu roboczym (./), ponieważ agenty są często uruchamiane z różnych lokalizacji. Aby uzyskać katalog skryptu i użyć go jako bazy, należy zastosować 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)Szybki test: menedżery kontekstu
Sprawdź swoją znajomość najlepszych praktyk dotyczących operacji wejścia-wyjścia na plikach.
Podsumowanie operacji wejścia-wyjścia na plikach
Masz już solidne podstawy operacji na plikach w kodzie agentów:
- Do odczytu używaj
open('file', 'r', encoding='utf-8'), do zapisu trybu'w', a do dopisywania trybu'a' - Zawsze używaj instrukcji with, aby zapewnić zamknięcie plików
- pathlib.Path zapewnia przejrzystą, wieloplatformową obsługę ścieżek za pomocą
read_text()/write_text() - W przypadku danych strukturalnych używaj
json.load(f)/json.dump(data, f, indent=2) - W przypadku dużych plików iteruj po nich wiersz po wierszu, aby ograniczyć zużycie pamięci
- Jako katalogu bazowego używaj
Path(__file__).parent— nigdy nie polegaj na cwd
Ucz się AI Agents dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 60
- Lekcje
- 239
Często zadawane pytania
Czy lekcja „Odczyt i zapis plików w kontekście agenta” jest bezpłatna?
Tak — pełny tekst „Odczyt i zapis plików w kontekście agenta” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Agents, przejdź na CoddyKit PRO. Kurs AI Agents zawiera 4 lekcji w sumie.
Co nauczysz się w „Odczyt i zapis plików w kontekście agenta”?
open(), pathlib.Path oraz odczytywanie plików CSV/JSON/TXT za pomocą narzędzi agenta. Ćwiczysz AI Agents z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Agents?
Nie wymagamy żadnego doświadczenia. AI Agents w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Odczyt i zapis plików w kontekście agenta”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Agents?
Tak. Każda lekcja AI Agents zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Odczyt i zapis plików w kontekście agenta
- Przechodzenie po katalogach i wyszukiwanie plików
- Obsługa formatów plików: CSV, JSON i TXT
- Bezpieczne operacje na plikach z obsługą błędów