Python Learningاز صفر تا نوشتن پروژه از حفظ
درس ۱۰ · ابزارهای پروژه

فایل و JSON

حدود ۴۵ دقیقه۳ تمرین۶ سؤال آزمون
بعد از این درس می‌توانی:
  • با open و with فایل بنویسی و بخوانی
  • حالت‌های 'r'، 'w' و encoding='utf-8' را بشناسی
  • دیکشنری را با json.dump ذخیره و با json.load بازیابی کنی
  • با os.path مسیر فایل بسازی و وجودش را چک کنی

چرا فایل؟

متغیرها با بستن برنامه پاک می‌شوند. برای اینکه کالاها بمانند، باید در فایل نوشته شوند. کارگاه این سایت یک فایل‌سیستم مجازی دارد، پس می‌توانی همین‌جا تمرین کنی.

نوشتن و خواندن متن

اجرا کن

خودت امتحان کن

Ctrl + Enter
حالتیعنی
'r'خواندن (فایل باید وجود داشته باشد)
'w'نوشتن؛ محتوای قبلی پاک می‌شود، اگر نباشد ساخته می‌شود
'a'اضافه کردن به آخر فایل

with تضمین می‌کند فایل آخر کار بسته شود، حتی اگر وسطش خطا رخ دهد. encoding='utf-8' برای درست ذخیره شدن حروف فارسی لازم است.

JSON: ذخیره‌ی دیکشنری

JSON یک قالب متنی است که دیکشنری و لیست را خیلی شبیه خود پایتون ذخیره می‌کند. ماژول json باید اول import شود:

اجرا کن

خودت امتحان کن

Ctrl + Enter
در پروژه‌ی فروشگاه

save در خط ۱۴ پروژه تا خط ۱۶ پروژه و load در خط ۱۸ پروژه تا خط ۲۶ پروژه دقیقاً همین‌اند.

تمرین

ذخیره و بازیابی

تابع save(data, path) بنویس که دیکشنری را با json.dump (با ensure_ascii=False و indent=2) در فایل بنویسد، و تابع load(path) که آن را بخواند و برگرداند.

Ctrl + Enter
دیدن راه‌حل (اول خودت تلاش کن)
import json

def save(data, path):
    with open(path, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

def load(path):
    with open(path, 'r', encoding='utf-8') as f:
        return json.load(f)

os.path: مسیر و وجود فایل

اجرا کن

خودت امتحان کن

Ctrl + Enter

اسم خالی فایل (مثل 'shop_data.json') در «پوشه‌ی فعلی ترمینال» پیدا می‌شود، نه کنار برنامه. برای اینکه فایل همیشه کنار خود برنامه باشد:

Python
import os
FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'shop_data.json')

__file__ مسیر همین فایل برنامه است، abspath کاملش می‌کند، dirname پوشه‌اش را جدا می‌کند و join نام فایل داده را به آن می‌چسباند. (این خط در کارگاه مرورگر کار نمی‌کند چون __file__ ندارد؛ در VS Code امتحانش کن.)

در پروژه‌ی فروشگاه

خط ۶ پروژه همین خط است و خط ۱۹ پروژه با os.path.exists(FILE) چک می‌کند فایل هست یا بار اول است.

تمرین

بارگذاری امن

تابع load_or_empty(path) بنویس: اگر فایل وجود نداشت {'products': {}, 'sales': []} برگرداند؛ اگر بود و JSON درست بود محتوایش را؛ اگر JSON خراب بود (json.JSONDecodeError) باز همان دیکشنری خالی را.

Ctrl + Enter
دیدن راه‌حل (اول خودت تلاش کن)
import json
import os

def load_or_empty(path):
    empty = {'products': {}, 'sales': []}
    if not os.path.exists(path):
        return empty
    try:
        with open(path, 'r', encoding='utf-8') as f:
            return json.load(f)
    except json.JSONDecodeError:
        return empty
جای خالی

جاهای خالی را پر کن

خط ذخیره‌ی برنامه را از حفظ کامل کن:

with open(FILE, , encoding=) as f:
    json.({'products': self.products, 'sales': self.sales}, f, ensure_ascii=, indent=)

آزمون این درس

برای گذراندن این درس حداقل ۸۰٪ جواب درست لازم است. هر چند بار خواستی می‌توانی دوباره امتحان بدهی.

۱. open(path, 'w') با فایلی که محتوا دارد چه می‌کند؟
۲. فایده‌ی with open(...) as f:؟
۳. json.dump چه می‌کند؟
۴. ensure_ascii=False برای چیست؟
۵. os.path.exists(p) چه برمی‌گرداند؟
۶. چرا مسیر فایل داده از __file__ ساخته می‌شود؟