Tekoälyagentit · Oppitunti

Tiedostomuotojen käsittely: CSV, JSON ja TXT

csv-moduuli, json.load/dump ja turvallinen tekstikoodaus agenttityökaluja varten

Oppitunti 3/413 vaihetta

Tiedostomuotojen käsittely: CSV, JSON ja TXT on ilmainen Tekoälyagentit-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Tekoälyagentit-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Tekoälyagentit-kurssilla on yhteensä 4 oppituntia.

Agenttien kolme yleisintä tiedostomuotoa

Agentit lukevat ja kirjoittavat jatkuvasti kolmea tiedostomuotoa: CSV taulukkomuotoiselle datalle, JSON jäsennellyille olioille ja pelkkä teksti lokeille, kehotteille ja raporteille. Jokaisella on erilaiset jäsennysvaatimukset, erityistapaukset ja parhaat käytännöt. Python tukee erinomaisesti kaikkia kolmea sisäänrakennetuilla toiminnoilla.

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 — CSV:n perusjäsennys

csv.reader jäsentää CSV-tiedoston rivi kerrallaan ja palauttaa jokaisen rivin merkkijonojen luettelona. Se käsittelee oikein lainausmerkeissä olevat kentät, arvojen sisältämät pilkut ja lainausmerkeissä olevien arvojen sisäiset rivinvaihdot — toisin kuin pilkuilla manuaalisesti jakaminen, joka ei toimi erityistapauksissa.

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 — rivi sanakirjana

csv.DictReader lukee jokaisen rivin OrderedDict-oliona (tai tavallisena dict-oliona Python 3.8:ssa ja uudemmissa versioissa), jossa sarakeotsikot ovat avaimina. Tämä on paljon helpompi tapa työskennellä kuin sijaintiin perustuva indeksointi — koodi pysyy luettavana, vaikka sarakkeiden järjestystä muutetaan.

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 ja DictWriter — CSV:n kirjoittaminen

Käyttäkää csv.writer-oliota rivien kirjoittamiseen luetteloina tai csv.DictWriter-oliota rivien kirjoittamiseen sanakirjoina. Välittäkää tiedostoa avatessa aina newline='' — csv-moduuli käsittelee rivinvaihdot itse ja estää näin ylimääräiset rivinvaihdot Windowsissa.

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() ja json.dump() — tiedosto-I/O

Käyttäkää json.load(file)-funktiota JSON-tiedoston jäsentämiseen ja json.dump(obj, file)-funktiota sen kirjoittamiseen. Nämä toimivat tiedosto-olioiden kanssa. Käyttäkää merkkijonoille funktioita json.loads(string) ja json.dumps(obj). Käyttäkää tulosteessa aina asetusta indent=2, jotta se on luettavaa.

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

JSON-dekoodausvirheiden käsittely

Virheelliset JSON-tiedostot ovat yleisiä agenttien putkissa: kirjoitus voi jäädä kesken, lataus voi katketa tai merkistössä voi olla ongelmia. Käärikää json.load() aina try/except-rakenteeseen ja ilmoittakaa virheestä selkeästi sisällyttämällä tiedostopolku vianmääritystä varten.

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

JSONL-muodon (JSON Lines) lukeminen

Monet tekoäly-API:t ja datan käsittelyputket käyttävät JSONL-muotoa (JSON Lines), jossa on yksi JSON-olio riviä kohden. Tämä muoto tukee suoratoistoa, ja sitä on helppo käsitellä rivi kerrallaan lataamatta koko tiedostoa muistiin. Jokainen rivi on täydellinen, itsenäinen JSON-olio.

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

Pelkkien tekstitiedostojen lukeminen

Pelkkä teksti on yksinkertaisin tiedostomuoto: lokit, kehotteet, raportit ja määritystiedostot. Lukekaa koko tiedosto .read()-metodilla tai käsitelkää se rivi kerrallaan. Käyttäkää suurten tiedostojen kanssa aina rivi kerrallaan -menetelmää, jotta muistin käyttö pysyy vakiona.

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

BOM:n (Byte Order Mark) käsittely

Excelistä tai Windows-työkaluista viedyt tiedostot alkavat usein BOM-merkillä (Byte Order Mark), joka on näkymätön \ufeff-merkki. Jos sitä ei käsitellä, se turmelee CSV-jäsennyksessä ensimmäisen kentän nimen. Käyttäkää asetusta encoding='utf-8-sig' sen poistamiseen automaattisesti.

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)

Merkistövirheiden käsittely

Tuntemattomista lähteistä luettavissa tiedostoissa merkistövirheet ovat yleisiä. open()-funktion parametri errors määrittää, mitä tapahtuu: 'replace' korvaa virheelliset merkit merkillä ?, 'ignore' poistaa ne ja 'backslashreplace' esittää ne kenoviivalla alkavina ohjausmerkkeinä. Käyttäkää tiukkaan kelpoisuustarkistukseen arvoa 'strict' (oletusarvo).

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

Virheellisten CSV-tiedostojen käsittely

Oikean maailman CSV-tiedostoissa on ongelmia: ylimääräisiä pilkkuja, puuttuvia kenttiä, epäjohdonmukaisia lainausmerkkejä tai sekoittuneita erotinmerkkejä. Käyttäkää asetuksia quoting ja error_bad_lines ja käärikää rivien jäsennys try/except-rakenteeseen, jotta virheelliset rivit voidaan ohittaa hallitusti.

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

Pikatarkistus: CSV DictReader vs reader

Testatkaa ymmärrystänne CSV:n jäsennysvaihtoehdoista.

Tiedostomuotojen käsittelyn kertaus

Osaatte nyt jäsentää ja kirjoittaa kaikki tärkeimmät agenttien käyttämät tiedostomuodot:

  • CSV: käyttäkää csv.DictReader-oliota sanakirjariveihin ja csv.DictWriter-oliota tulosteeseen; käyttäkää avatessa aina asetusta newline=''
  • JSON: json.load(f) jäsentämiseen ja json.dump(obj, f, indent=2) kirjoittamiseen; käsitelkää JSONDecodeError
  • JSONL: lukekaa ja jäsentäkää jokainen rivi komennolla json.loads(line); sopii erinomaisesti suoratoistodatalle
  • Pelkkä teksti: .read() pienille tiedostoille ja rivien läpikäynti suurille tiedostoille
  • BOM: käyttäkää asetusta encoding='utf-8-sig' Windowsista viedyille tiedostoille
  • Merkistövirheet: kokeilkaa UTF-8:aa, käyttäkää varalla latin-1:tä tai asetusta errors='replace'
Aloita maksutta

Opi Tekoälyagentit tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
60
Oppitunnit
239

Usein kysytyt kysymykset

Onko oppitunti ”Tiedostomuotojen käsittely: CSV, JSON ja TXT” ilmainen?

Kyllä – oppitunnin ”Tiedostomuotojen käsittely: CSV, JSON ja TXT” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Tekoälyagentit-kurssin, päivitä CoddyKit PROhon. Tekoälyagentit-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Tiedostomuotojen käsittely: CSV, JSON ja TXT”?

csv-moduuli, json.load/dump ja turvallinen tekstikoodaus agenttityökaluja varten Harjoittelet Tekoälyagentit-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Tekoälyagentit-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Tekoälyagentit-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Tiedostomuotojen käsittely: CSV, JSON ja TXT”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Tekoälyagentit-oppitunnilla?

Kyllä. Jokainen Tekoälyagentit-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Tiedostojen lukeminen ja kirjoittaminen agentin kontekstissa
  2. Hakemistojen läpikäynti ja tiedostojen etsiminen
  3. Tiedostomuotojen käsittely: CSV, JSON ja TXT
  4. Turvalliset tiedosto-operaatiot virheenkäsittelyllä
← Takaisin: Tekoälyagentit