ذخیره کردن و خواندن داده‌هایی که کاربر تولید کرده

هنگام کار با داده‌هایی که کاربر تولید کرده، ذخیره کردن آن‌ها با JSON سودمند است، زیرا اگر اطّلاعات او را جایی به شکلی ذخیره نکنید، با توقّف اجرای برنامه آن‌ها را از دست خواهید داد. به مثالی نگاه می‌کنیم که در آن در اوّلین اجرای برنامه از کاربر نام او را می‌پرسیم و سپس زمانی که برنامه را دوباره اجرا کرد، نامش را به خاطر می‌آوریم.

با ذخیره کردن نام کاربر شروع می‌کنیم:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import json

username = input("What is your name? ")

filename = 'username.json'

with open(filename, 'w') as f:
    json.dump(username, f)

print(f"We'll remember you when you come back, {username}!")

در ۱ یک نام کاربری را برای ذخیره کردن می‌پرسیم. سپس از json.dump() استفاده می‌کنیم و نام کاربری و یک شیء فایل را به آن می‌دهیم تا نام کاربری را در یک فایل ذخیره کند (۲). سپس پیامی چاپ می‌کنیم که ذخیره شدنِ اطّلاعات را به کاربران اطّلاع می‌دهد (۳):

1
2
3
What is your name? Eric

We'll remember you when you come back, Eric!

اکنون برنامه‌ای جدید می‌نویسیم که به کاربری که نام او قبلاً ذخیره شده سلام می‌کند:

1
2
3
4
5
6
7
8
import json

filename = 'username.json'

with open(filename) as f:
    username = json.load(f)

print(f"Welcome back, {username}!")

در ۱ از json.load() برای خواندنِ اطّلاعات ذخیره شده در username.json استفاده و آن را به متغیّر username نسبت می‌دهیم. اکنون نام‌های کاربری را بازیابی کرده‌ایم و می‌توانیم به آن‌ها خوش‌آمد بگوییم (۲):

1
Welcome back, Eric!

ما به ترکیب این دو برنامه در یک فایل نیاز داریم. زمانی که کسی remember_me.py را اجرا می‌کند، می‌خواهیم در صورتِ امکان، نامِ کاربریِ او را از حافظه بازیابی کنیم؛ بنابراین با یک بلوک try شروع می‌کنیم که سعی می‌کند نام کاربری را بازیابی کند. اگر فایل username.json وجود نداشته باشد، در بلوک except نام کاربری را می‌پرسیم و برای دفعات بعد در username.json ذخیره می‌کنیم:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import json

# Load the username, if it has been stored previously.
#   Otherwise, prompt for the username and store it.

filename = 'username.json'

try:
    with open(filename) as f:
        username = json.load(f)
except FileNotFoundError:
    username = input("What is your name? ")
    with open(filename, 'w') as f:
        json.dump(username, f)
    print(f"We'll remember you when you come back, {username}!")
else:
    print(f"Welcome back, {username}!")

هیچ کد جدیدی اینجا وجود ندارد؛ فقط بلوک‌های کد دو مثال قبلی را در یک فایل ترکیب کرده‌ایم. در ۱ تلاش می‌کنیم که فایل username.json را باز کنیم. اگر این فایل وجود داشته باشد، نام کاربری را از آن می‌خوانیم (۲) و پیام خوش‌آمدی خطاب به کاربر در بلوک else چاپ می‌کنیم. اگر این اوّلین باری باشد که کاربر برنامه را اجرا می‌کند، پس username.json وجود ندارد و خطای FileNotFoundError رخ خواهد داد (۳). پایتون به بلوک except می‌رود و در آن‌جا از کاربر نام کاربری‌اش را می‌پرسد (۴). سپس از json.dump() برای ذخیره کردن نام کاربری استفاده می‌کنیم و پیامی چاپ می‌کنیم (۵).

هر کدام از بلوک‌ها که اجرا شوند، نتیجه یک نام کاربری و یک پیام مناسب خواهد بود. اگر اوّلین اجرای برنامه باشد، خروجی این‌چنین خواهد بود:

1
2
3
What is your name? Eric

We'll remember you when you come back, Eric!

در غیر این صورت:

1
Welcome back, Eric!

این خروجی‌ای است که اگر برنامه قبلاً یک بار اجرا شده باشد خواهید دید.