حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش کار با فایل در پایتون؛ CSV، JSON و گزارش‌گیری

رفع باگ ذخیره فایل JSON در پایتون؛ dump یا dumps

JSON در پایتون؛ تبدیل داده و ذخیره گزارش فارسی · 0٪

✍️ dump داده را در یک فایل باز می‌نویسد و dumps متن JSON را در حافظه برمی‌گرداند. اگر ابتدا dumps کنیم و بعد آن رشته را با dump ذخیره کنیم، یک رشته JSON درون یک رشته JSON ساخته‌ایم. فایل معتبر است، ولی بعد از load به جای دیکشنری، متن به دست می‌آید؛ این خطا از جنس نوع داده است، نه خطای نگارشی.

مثلاً هدف ذخیره {'total':12} است. یک بار dump روی دیکشنری کافی است. اگر متن ' {"total":12} ' را به عنوان داده رشته‌ای dump کنیم، نقل‌قول‌ها escape می‌شوند و load همان رشته را تحویل می‌دهد. برنامه ممکن است تا زمان دسترسی به کلید total ظاهراً سالم باشد.

کد اولیه را اصلاح کن تا داده اصلی مستقیم به json.dump برسد. فایل را با UTF-8 بنویس؛ برای خواندن راحت‌تر خود فایل می‌توانی ensure_ascii=False هم بدهی و بعد با json.load از همان مسیر بخوان. نتیجه بازخوانی‌شده باید همان ساختار داده باشد. خطای رایج دیگر، دادن مسیر به load به‌جای شیء فایل است؛ load انتظار فایل باز دارد. پوشه موقت این تمرین نمونه را همان‌جا می‌سازد، بنابراین هیچ گزارش قبلی لازم نیست.

تابع آماده course_check از ورودی کپی عمیق می‌گیرد، تابع اصلی را اجرا می‌کند و تغییر ورودی را رد می‌کند؛ آن را نگه دار و فقط تابع اصلی را کامل کن.

فعالیت شما

تابع save_and_load_json(data) داده JSON‌پذیر با کلید رشته‌ای و عدد صحیح را در فایل report.json داخل پوشه موقت با json.dump و UTF-8 بنویسد؛ سپس با json.load بخواند و نتیجه را بدهد. داده را دوبار serialize نکن. None، ساختار خالی و تو در تو مجازند؛ save_and_load_json({'کل':12})={'کل':12}. ورودی تغییر نکند. course_check آماده را نگه دار؛ این تابع تغییر ورودی را رد و همان خروجی اصلی را برمی‌گرداند.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

import tempfile
from pathlib import Path
import json

def save_and_load_json(data):
    with tempfile.TemporaryDirectory() as folder:
        path = Path(folder) / 'report.json'
        with open(path, 'w', encoding='utf-8') as file:
            json.dump(json.dumps(data, ensure_ascii=False), file, ensure_ascii=False)
        with open(path, encoding='utf-8') as file:
            return json.load(file)


def course_check(*args):
    from copy import deepcopy
    before = deepcopy(args)
    result = save_and_load_json(*args)
    if args != before:
        raise AssertionError("ورودی نباید تغییر کند.")
    return result