0Pricing
AI Agents · درس

التعامل مع تنسيقات الملفات: CSV وJSON وTXT

الوحدة csv وjson.load/dump وترميز النصوص الآمن لأدوات الوكيل

التعامل مع تنسيقات الملفات: CSV وJSON وTXT درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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)

تستخدم العديد من واجهات AI البرمجية ومسارات البيانات تنسيق 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'

الأسئلة الشائعة

هل درس «التعامل مع تنسيقات الملفات: CSV وJSON وTXT» مجاني؟

نعم — نص درس «التعامل مع تنسيقات الملفات: CSV وJSON وTXT» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.

ماذا ستتعلم في «التعامل مع تنسيقات الملفات: CSV وJSON وTXT»؟

الوحدة csv وjson.load/dump وترميز النصوص الآمن لأدوات الوكيل تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟

لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «التعامل مع تنسيقات الملفات: CSV وJSON وTXT»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟

نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. قراءة الملفات وكتابتها في سياق الوكيل
  2. اجتياز المجلدات واكتشاف الملفات
  3. التعامل مع تنسيقات الملفات: CSV وJSON وTXT
  4. عمليات الملفات الآمنة مع معالجة الأخطاء
← العودة إلى AI Agents