AI Agents · บทเรียน

การจัดการรูปแบบไฟล์: CSV, JSON และ TXT

โมดูล csv, json.load/dump และการเข้ารหัสข้อความอย่างปลอดภัยสำหรับเครื่องมือตัวแทน

บทเรียน 3 จาก 413 ขั้นตอน

การจัดการรูปแบบไฟล์: CSV, JSON และ TXT เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

รูปแบบไฟล์สามประเภทที่เอเจนต์ใช้บ่อยที่สุด

เอเจนต์อ่านและเขียนรูปแบบไฟล์สามประเภทอยู่เป็นประจำ ได้แก่ CSV สำหรับข้อมูลแบบตาราง JSON สำหรับวัตถุที่มีโครงสร้าง และข้อความธรรมดาสำหรับไฟล์บันทึก คำสั่ง และรายงาน แต่ละรูปแบบมีข้อกำหนดในการแยกวิเคราะห์ กรณีขอบ และแนวทางปฏิบัติที่ดีแตกต่างกัน Python มีการรองรับทั้งสามรูปแบบในตัวอย่างดีเยี่ยม

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 พื้นฐาน

csv.reader แยกวิเคราะห์ไฟล์ CSV ทีละแถว และส่งคืนแต่ละแถวเป็นรายการสตริง ฟังก์ชันนี้จัดการช่องข้อมูลที่ครอบด้วยเครื่องหมายคำพูด เครื่องหมายจุลภาคที่อยู่ภายในค่า และอักขระขึ้นบรรทัดใหม่ภายในค่าที่ครอบด้วยเครื่องหมายคำพูดได้อย่างถูกต้อง ต่างจากการแยกด้วยเครื่องหมายจุลภาคด้วยตนเอง ซึ่งจะทำงานผิดพลาดในกรณีขอบ

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 — แถวในรูปพจนานุกรม

csv.DictReader อ่านแต่ละแถวเป็น OrderedDict (หรือพจนานุกรมทั่วไปใน Python 3.8 ขึ้นไป) โดยใช้หัวคอลัมน์เป็นคีย์ วิธีนี้ทำงานได้ง่ายกว่าการอ้างอิงตามตำแหน่งมาก โค้ดของคุณยังคงอ่านเข้าใจได้แม้มีการจัดเรียงคอลัมน์ใหม่

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 และ DictWriter — การเขียน CSV

ใช้ csv.writer เพื่อเขียนแถวในรูปแบบรายการ หรือใช้ csv.DictWriter เพื่อเขียนแถวในรูปแบบพจนานุกรม ควรส่ง newline='' เมื่อเปิดไฟล์เสมอ เพราะมอดูล csv จัดการจุดสิ้นสุดบรรทัดเองเพื่อหลีกเลี่ยงการขึ้นบรรทัดใหม่ซ้ำสองครั้งบน 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() และ json.dump() — การรับส่งข้อมูลกับไฟล์

ใช้ json.load(file) เพื่อแยกวิเคราะห์ไฟล์ JSON และใช้ json.dump(obj, file) เพื่อเขียนไฟล์ ฟังก์ชันเหล่านี้ทำงานกับวัตถุไฟล์ หากทำงานกับสตริง ให้ใช้ json.loads(string) และ json.dumps(obj) ควรใช้ indent=2 เสมอเพื่อให้ผลลัพธ์อ่านได้ง่าย

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

ไฟล์ JSON ที่มีรูปแบบไม่ถูกต้องพบได้บ่อยในกระบวนการของเอเจนต์ เช่น การเขียนที่ไม่เสร็จสมบูรณ์ การดาวน์โหลดที่ถูกตัด หรือปัญหาการเข้ารหัส ควรครอบ json.load() ด้วยโครงสร้าง try/except เสมอ และแสดงข้อความข้อผิดพลาดที่ชัดเจนโดยระบุพาธไฟล์เพื่อช่วยแก้ไขข้อบกพร่อง

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 (JSON Lines)

API ปัญญาประดิษฐ์และกระบวนการข้อมูลจำนวนมากใช้ JSONL (JSON Lines) ซึ่งมีวัตถุ JSON หนึ่งรายการต่อบรรทัด รูปแบบนี้รองรับการประมวลผลแบบสตรีม และประมวลผลทีละบรรทัดได้ง่ายโดยไม่ต้องโหลดไฟล์ทั้งหมดเข้าสู่หน่วยความจำ แต่ละบรรทัดเป็นวัตถุ JSON ที่สมบูรณ์และเป็นอิสระในตัวเอง

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

การอ่านไฟล์ข้อความธรรมดา

ข้อความธรรมดาเป็นรูปแบบที่ง่ายที่สุด ใช้กับไฟล์บันทึก คำสั่ง รายงาน และไฟล์การกำหนดค่า อ่านไฟล์ทั้งหมดด้วย .read() หรือประมวลผลทีละบรรทัด สำหรับไฟล์ขนาดใหญ่ ควรใช้แนวทางทีละบรรทัดเสมอเพื่อให้การใช้หน่วยความจำคงที่

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 (เครื่องหมายลำดับไบต์)

ไฟล์ที่ส่งออกจาก Excel หรือเครื่องมือของ Windows มักเริ่มต้นด้วย BOM (เครื่องหมายลำดับไบต์) ซึ่งเป็นอักขระ \ufeff ที่มองไม่เห็น หากไม่จัดการ อักขระนี้จะทำให้ชื่อช่องข้อมูลแรกในการแยกวิเคราะห์ CSV เสียหาย ให้ใช้ encoding='utf-8-sig' เพื่อแยกอักขระนี้ออกโดยอัตโนมัติ

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)

การจัดการข้อผิดพลาดด้านการเข้ารหัส

เมื่ออ่านไฟล์จากแหล่งที่ไม่ทราบแน่ชัด ข้อผิดพลาดด้านการเข้ารหัสเกิดขึ้นได้บ่อย พารามิเตอร์ errors ของ open() จะควบคุมสิ่งที่เกิดขึ้น ได้แก่ 'replace' แทนที่อักขระที่ไม่ถูกต้องด้วย ? ส่วน 'ignore' จะละทิ้งอักขระเหล่านั้น และ 'backslashreplace' จะแปลงอักขระเหล่านั้นเป็นรูปแบบหลีก สำหรับการตรวจสอบอย่างเข้มงวด ให้ใช้ 'strict' (ค่าเริ่มต้น)

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

การจัดการไฟล์ CSV ที่มีรูปแบบไม่ถูกต้อง

ไฟล์ CSV ในการใช้งานจริงอาจมีปัญหา เช่น เครื่องหมายจุลภาคเกิน ช่องข้อมูลหายไป การครอบด้วยเครื่องหมายคำพูดไม่สอดคล้องกัน หรือตัวคั่นปะปนกัน ให้ใช้ตัวเลือก quoting และ error_bad_lines และครอบการแยกวิเคราะห์แต่ละแถวด้วยโครงสร้าง try/except เพื่อข้ามแถวที่มีปัญหาได้อย่างเหมาะสม

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

ตรวจสอบความเข้าใจ: CSV DictReader กับ reader

ทดสอบความเข้าใจเกี่ยวกับตัวเลือกในการแยกวิเคราะห์ CSV

สรุปการจัดการรูปแบบไฟล์

ขณะนี้คุณสามารถแยกวิเคราะห์และเขียนรูปแบบไฟล์หลักทั้งหมดที่เอเจนต์ใช้ได้แล้ว:

  • CSV: ใช้ csv.DictReader สำหรับแถวในรูปพจนานุกรม และใช้ csv.DictWriter สำหรับผลลัพธ์ ควรใช้ newline='' เมื่อเปิดไฟล์เสมอ
  • JSON: ใช้ json.load(f) เพื่อแยกวิเคราะห์ และใช้ json.dump(obj, f, indent=2) เพื่อเขียน โดยดักจับ JSONDecodeError
  • JSONL: อ่านและแยกวิเคราะห์แต่ละบรรทัดด้วย json.loads(line) เหมาะอย่างยิ่งสำหรับข้อมูลแบบสตรีม
  • ข้อความธรรมดา: ใช้ .read() สำหรับไฟล์ขนาดเล็ก และวนอ่านทีละบรรทัดสำหรับไฟล์ขนาดใหญ่
  • BOM: ใช้ encoding='utf-8-sig' สำหรับไฟล์ที่ส่งออกจาก Windows
  • ข้อผิดพลาดด้านการเข้ารหัส: ลองใช้ UTF-8 ก่อน เปลี่ยนไปใช้ latin-1 หากไม่สำเร็จ หรือใช้ errors='replace'
เริ่มต้นได้ฟรี

เรียนรู้ AI Agents ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
60
บทเรียน
239

คำถามที่พบบ่อย

บทเรียน “การจัดการรูปแบบไฟล์: CSV, JSON และ TXT” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจัดการรูปแบบไฟล์: CSV, JSON และ TXT” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจัดการรูปแบบไฟล์: CSV, JSON และ TXT”

โมดูล csv, json.load/dump และการเข้ารหัสข้อความอย่างปลอดภัยสำหรับเครื่องมือตัวแทน คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การจัดการรูปแบบไฟล์: CSV, JSON และ TXT” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การอ่านและเขียนไฟล์ในบริบทของตัวแทน
  2. การไล่สำรวจไดเรกทอรีและค้นหาไฟล์
  3. การจัดการรูปแบบไฟล์: CSV, JSON และ TXT
  4. การดำเนินการกับไฟล์อย่างปลอดภัยพร้อมจัดการข้อผิดพลาด
← กลับไปที่ AI Agents