فایل و JSON
- با
openوwithفایل بنویسی و بخوانی - حالتهای
'r'،'w'وencoding='utf-8'را بشناسی - دیکشنری را با
json.dumpذخیره و باjson.loadبازیابی کنی - با
os.pathمسیر فایل بسازی و وجودش را چک کنی
چرا فایل؟
متغیرها با بستن برنامه پاک میشوند. برای اینکه کالاها بمانند، باید در فایل نوشته شوند. کارگاه این سایت یک فایلسیستم مجازی دارد، پس میتوانی همینجا تمرین کنی.
نوشتن و خواندن متن
خودت امتحان کن
| حالت | یعنی |
|---|---|
'r' | خواندن (فایل باید وجود داشته باشد) |
'w' | نوشتن؛ محتوای قبلی پاک میشود، اگر نباشد ساخته میشود |
'a' | اضافه کردن به آخر فایل |
with تضمین میکند فایل آخر کار بسته شود، حتی اگر وسطش خطا رخ دهد. encoding='utf-8' برای درست ذخیره شدن حروف فارسی لازم است.
JSON: ذخیرهی دیکشنری
JSON یک قالب متنی است که دیکشنری و لیست را خیلی شبیه خود پایتون ذخیره میکند. ماژول json باید اول import شود:
خودت امتحان کن
ensure_ascii=False: فارسی را همانطور ذخیره میکند (بدون آن\u0645...میشود). امتحانش کن!indent=2: فایل را مرتب و خوانا مینویسد.
save در خط ۱۴ پروژه تا خط ۱۶ پروژه و load در خط ۱۸ پروژه تا خط ۲۶ پروژه دقیقاً همیناند.
ذخیره و بازیابی
تابع save(data, path) بنویس که دیکشنری را با json.dump (با ensure_ascii=False و indent=2) در فایل بنویسد، و تابع load(path) که آن را بخواند و برگرداند.
دیدن راهحل (اول خودت تلاش کن)
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: مسیر و وجود فایل
خودت امتحان کن
اسم خالی فایل (مثل 'shop_data.json') در «پوشهی فعلی ترمینال» پیدا میشود، نه کنار برنامه. برای اینکه فایل همیشه کنار خود برنامه باشد:
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) باز همان دیکشنری خالی را.
دیدن راهحل (اول خودت تلاش کن)
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=)
آزمون این درس
برای گذراندن این درس حداقل ۸۰٪ جواب درست لازم است. هر چند بار خواستی میتوانی دوباره امتحان بدهی.