calculator.py
8.1 KB
🖩 ماشینحساب قدرتمند پایتون
یک ماشینحساب علمی با پایتون ساختم — سریع، امن و بدون نیاز به کتابخونهی اضافه.
امکانات: عملیات پایه، توابع علمی (sin, cos, log, sqrt, fact...)، حافظه (M+/MR/MC)، تاریخچه، ثابتهای pi و e، و محاسبه عبارات تودرتو.
راهاندازی
bash
تست سریع
🔐 برخلاف اکثر ماشینحسابهای مشابه، از
یک ماشینحساب علمی با پایتون ساختم — سریع، امن و بدون نیاز به کتابخونهی اضافه.
امکانات: عملیات پایه، توابع علمی (sin, cos, log, sqrt, fact...)، حافظه (M+/MR/MC)، تاریخچه، ثابتهای pi و e، و محاسبه عبارات تودرتو.
راهاندازی
bash
python3 calculator.py
تست سریع
>>> (3+5)*sqrt(16) - sin(30)
= 31.5
>>> fact(5)
= 120
>>> help ← راهنمای کامل
🔐 برخلاف اکثر ماشینحسابهای مشابه، از
eval() استفاده نمیکنه — تجزیه با AST انجام میشه، پس ورودی کاربر نمیتونه کد دلخواه اجرا کنه.🐍 آموزش جامع Python — پست ۱۴۶
پیدا کردن فایلها و پوشهها با
در پست قبل یاد گرفتیم چگونه فایلها و پوشهها را مدیریت کنیم.
حالا فرض کنید داخل یک پوشه تعداد زیادی فایل داریم و میخواهیم فقط فایلهای موردنظرمان را پیدا کنیم.
برای این کار میتوانیم از
🔹 پیدا کردن فایلهای خاص
فرض کنیم ساختار زیر را داریم:
میتوانیم تمام فایلهای
خروجی:
فایل
🔹
در:
علامت:
یعنی هر نامی.
پس:
یعنی:
مثلاً:
همه با این الگو مطابقت دارند.
🔹 پیدا کردن فایلهای Python
برای پیدا کردن فایلهای
🔹 جستجو در پوشههای تودرتو با
اما اگر بخواهیم داخل تمام زیرپوشهها نیز جستجو کنیم، میتوانیم از
مثلاً اگر ساختار این باشد:
🔹 فقط پوشهها
میتوانیم با
🔹 بررسی نوع نتیجه
هر چیزی که از
⚠️ نکته مهم
فقط مسیرهای مطابق الگو را پیدا میکند.
مثلاً:
فقط فایلهای
بعد میتوانیم روی آنها عملیات دیگری انجام دهیم.
🔥 مثال کاربردی
فرض کنیم میخواهیم اندازه فایلهای متنی را بررسی کنیم:
🧠 خلاصه
🎯 تمرین
ساختار زیر را در نظر بگیر:
برنامهای بنویس که:
تمام فایلهای
نام هر فایل را چاپ کند.
مسیر کامل هر فایل را نیز چاپ کند.
پست ۱۴۶ از دوره جامع Python 🐍
پیدا کردن فایلها و پوشهها با
Path.glob()در پست قبل یاد گرفتیم چگونه فایلها و پوشهها را مدیریت کنیم.
حالا فرض کنید داخل یک پوشه تعداد زیادی فایل داریم و میخواهیم فقط فایلهای موردنظرمان را پیدا کنیم.
برای این کار میتوانیم از
glob() در pathlib استفاده کنیم.🔹 پیدا کردن فایلهای خاص
فرض کنیم ساختار زیر را داریم:
project/
├── data/
│ ├── users.txt
│ ├── products.txt
│ ├── notes.txt
│ └── image.png
میتوانیم تمام فایلهای
.txt را پیدا کنیم:from pathlib import Path
data = Path("project/data")
for file in data.glob("*.txt"):
print(file)
خروجی:
project/data/users.txt
project/data/products.txt
project/data/notes.txt
فایل
image.png پیدا نمیشود، چون پسوند آن .png است.🔹
glob("*.txt") یعنی چه؟در:
data.glob("*.txt")علامت:
*
یعنی هر نامی.
پس:
*.txt
یعنی:
هر فایلی که پسوند آن
.txtباشد.
مثلاً:
users.txt
notes.txt
data.txt
همه با این الگو مطابقت دارند.
🔹 پیدا کردن فایلهای Python
برای پیدا کردن فایلهای
.py:from pathlib import Path
project = Path("project")
for file in project.glob("*.py"):
print(file)
🔹 جستجو در پوشههای تودرتو با
rglob()glob() بهصورت معمول در همان پوشه جستجو میکند.اما اگر بخواهیم داخل تمام زیرپوشهها نیز جستجو کنیم، میتوانیم از
rglob() استفاده کنیم:from pathlib import Path
project = Path("project")
for file in project.rglob("*.txt"):
print(file)
مثلاً اگر ساختار این باشد:
project/
├── data/
│ ├── users.txt
│ └── products.txt
│
└── backup/
└── old/
└── users.txt
rglob("*.txt") هر سه فایل .txt را پیدا میکند.🔹 فقط پوشهها
میتوانیم با
glob() پوشهها را هم پیدا کنیم:from pathlib import Path
project = Path("project")
for item in project.glob("*"):
if item.is_dir():
print(item)
🔹 بررسی نوع نتیجه
هر چیزی که از
glob() دریافت میکنیم یک شیء Path است:from pathlib import Path
data = Path("project/data")
for item in data.glob("*"):
print(item)
print(type(item))
⚠️ نکته مهم
glob() خودش فایلها را حذف یا تغییر نمیدهد.فقط مسیرهای مطابق الگو را پیدا میکند.
مثلاً:
files = data.glob("*.txt")فقط فایلهای
.txt را پیدا میکند.بعد میتوانیم روی آنها عملیات دیگری انجام دهیم.
🔥 مثال کاربردی
فرض کنیم میخواهیم اندازه فایلهای متنی را بررسی کنیم:
from pathlib import Path
data = Path("project/data")
for file in data.glob("*.txt"):
print(file.name, file.stat().st_size)
stat().st_size اندازه فایل را برحسب بایت برمیگرداند.🧠 خلاصه
glob("*.txt")
→ پیدا کردن فایلهای txt در همان پوشه
glob("*")
→ پیدا کردن موارد موجود در همان پوشه
rglob("*.txt")
→ پیدا کردن فایلهای txt در پوشه و تمام زیرپوشهها🎯 تمرین
ساختار زیر را در نظر بگیر:
project/
├── data/
│ ├── users.txt
│ ├── products.txt
│ └── image.png
│
└── backup/
└── old/
└── users.txt
برنامهای بنویس که:
تمام فایلهای
.txt داخل project و زیرپوشههای آن را پیدا کند.نام هر فایل را چاپ کند.
مسیر کامل هر فایل را نیز چاپ کند.
پست ۱۴۶ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۴۷
اطلاعات فایل با
در پست قبل با
حالا میخواهیم اطلاعات بیشتری درباره یک فایل یا مسیر به دست بیاوریم؛ مثل اندازه فایل، زمان تغییر و نوع مسیر.
برای این کار میتوانیم از
🔹 اندازه فایل با
مثلاً:
یعنی اندازه فایل ۱۲۵ بایت است.
🔹 چند ویژگی مهم
شیء برگشتی از
یعنی:
مقدار
🔹 تبدیل زمان تغییر به تاریخ قابل خواندن
برای نمایش زمان به شکل قابل فهمتر:
خروجی مثلاً:
زمان دقیق به سیستم شما بستگی دارد.
🔹 بررسی اندازه فایل
میتوانیم از اندازه فایل برای یک بررسی ساده استفاده کنیم:
اگر فایل خالی باشد:
🔹
در پستهای قبل با این متدها آشنا شدیم:
میتوانیم آنها را برای تصمیمگیری درباره مسیر استفاده کنیم:
ترتیب این بررسیها مهم است؛ ابتدا مطمئن میشویم مسیر واقعاً وجود دارد.
🔹 یک مثال کاربردی
فرض کنیم میخواهیم مشخصات فایلهای متنی یک پوشه را نمایش دهیم:
در اینجا ابتدا فایلها را با
⚠️ نکته مهم
بهتر است قبل از استفاده، وجود مسیر را بررسی کنیم:
🧠 خلاصه
🎯 تمرین
برنامهای بنویس که:
فایلهای
نام هر فایل را چاپ کند.
اندازه هر فایل را برحسب بایت چاپ کند.
زمان آخرین تغییر هر فایل را نمایش دهد.
پست ۱۴۷ از دوره جامع Python 🐍
اطلاعات فایل با
stat() و ویژگیهای مسیردر پست قبل با
glob() فایلها را پیدا کردیم.حالا میخواهیم اطلاعات بیشتری درباره یک فایل یا مسیر به دست بیاوریم؛ مثل اندازه فایل، زمان تغییر و نوع مسیر.
برای این کار میتوانیم از
stat() استفاده کنیم.🔹 اندازه فایل با
stat()from pathlib import Path
file = Path("data/users.txt")
info = file.stat()
print(info.st_size)
st_size اندازه فایل را برحسب بایت برمیگرداند.مثلاً:
125
یعنی اندازه فایل ۱۲۵ بایت است.
🔹 چند ویژگی مهم
شیء برگشتی از
stat() اطلاعات مختلفی دارد:from pathlib import Path
file = Path("data/users.txt")
info = file.stat()
print(info.st_size)
print(info.st_mtime)
یعنی:
st_size → اندازه فایل برحسب بایت
st_mtime → زمان آخرین تغییر
مقدار
st_mtime معمولاً به شکل یک timestamp عددی نمایش داده میشود.🔹 تبدیل زمان تغییر به تاریخ قابل خواندن
برای نمایش زمان به شکل قابل فهمتر:
from pathlib import Path
from datetime import datetime
file = Path("data/users.txt")
timestamp = file.stat().st_mtime
modified = datetime.fromtimestamp(timestamp)
print(modified)
خروجی مثلاً:
2026-09-23 18:42:10
زمان دقیق به سیستم شما بستگی دارد.
🔹 بررسی اندازه فایل
میتوانیم از اندازه فایل برای یک بررسی ساده استفاده کنیم:
from pathlib import Path
file = Path("data/users.txt")
if file.stat().st_size == 0:
print("File is empty")
else:
print("File has content")
اگر فایل خالی باشد:
File is empty
🔹
exists()، is_file() و is_dir()در پستهای قبل با این متدها آشنا شدیم:
path.exists()
path.is_file()
path.is_dir()
میتوانیم آنها را برای تصمیمگیری درباره مسیر استفاده کنیم:
from pathlib import Path
path = Path("data/users.txt")
if not path.exists():
print("Path does not exist")
elif path.is_file():
print("This is a file")
elif path.is_dir():
print("This is a directory")
ترتیب این بررسیها مهم است؛ ابتدا مطمئن میشویم مسیر واقعاً وجود دارد.
🔹 یک مثال کاربردی
فرض کنیم میخواهیم مشخصات فایلهای متنی یک پوشه را نمایش دهیم:
from pathlib import Path
data = Path("data")
for file in data.glob("*.txt"):
info = file.stat()
print("Name:", file.name)
print("Size:", info.st_size, "bytes")
print("Modified:", info.st_mtime)
print()
در اینجا ابتدا فایلها را با
glob() پیدا میکنیم و سپس با stat() اطلاعات هر فایل را میگیریم.⚠️ نکته مهم
stat() اطلاعات سیستم فایل را میخواند؛ بنابراین برای مسیری که وجود ندارد، معمولاً خطای FileNotFoundError دریافت میکنیم.بهتر است قبل از استفاده، وجود مسیر را بررسی کنیم:
if file.exists():
info = file.stat()
🧠 خلاصه
path.stat()
→ دریافت اطلاعات فایل یا مسیر
st_size
→ اندازه فایل برحسب بایت
st_mtime
→ زمان آخرین تغییر
exists()
→ آیا مسیر وجود دارد؟
is_file()
→ آیا فایل است؟
is_dir()
→ آیا پوشه است؟
🎯 تمرین
برنامهای بنویس که:
فایلهای
.txt داخل data را پیدا کند.نام هر فایل را چاپ کند.
اندازه هر فایل را برحسب بایت چاپ کند.
زمان آخرین تغییر هر فایل را نمایش دهد.
پست ۱۴۷ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۴۸
مسیرهای مطلق و نسبی با
در پستهای قبل بیشتر با مسیرهایی مثل:
کار کردیم.
این نوع مسیر یک مسیر نسبی (Relative Path) است.
حالا باید تفاوت مسیر نسبی و مسیر مطلق (Absolute Path) را یاد بگیریم.
🔹 مسیر نسبی چیست؟
مسیر نسبی از پوشه کاری فعلی برنامه محاسبه میشود.
مثلاً:
این مسیر میگوید:
اگر پوشه کاری برنامه تغییر کند، محل این فایل هم میتواند متفاوت باشد.
🔹 مسیر مطلق چیست؟
مسیر مطلق، آدرس کامل فایل یا پوشه را مشخص میکند.
مثلاً در Windows:
خروجی:
مسیر مطلق دیگر به پوشه کاری فعلی وابسته نیست.
🔹 بررسی مطلق یا نسبی بودن مسیر
با:
میتوانیم بررسی کنیم مسیر مطلق است یا نه.
مثلاً:
خروجی:
🔹 تبدیل مسیر نسبی به مسیر مطلق
با
مثلاً ممکن است خروجی چیزی شبیه این باشد:
مسیر دقیق به محل اجرای برنامه بستگی دارد.
🔹 پیدا کردن پوشه کاری فعلی
میتوانیم مسیر کاری فعلی را با:
ببینیم:
مثلاً:
این همان مسیری است که مسیرهای نسبی معمولاً نسبت به آن تفسیر میشوند.
🔹 ساخت مسیر نسبت به پوشه کاری
میتوانیم مسیر فعلی را با مسیر دیگری ترکیب کنیم:
⚠️ نکته مهم
مسیر نسبی همیشه بد نیست.
برای پروژههایی که ساختار مشخصی دارند، مسیر نسبی میتواند بسیار مناسب باشد:
مثلاً:
خواناتر از یک مسیر مطلق طولانی است.
اما مسیر مطلق برای بعضی کاربردها لازم است؛ مخصوصاً زمانی که باید دقیقاً یک محل مشخص در سیستم فایل را مشخص کنیم.
🔥 مثال مقایسهای
مسیر نسبی:
مسیر مطلق:
اولی به محیط اجرای برنامه وابسته است.
دومی محل دقیق فایل را مشخص میکند.
🧠 خلاصه
🎯 تمرین
کدی بنویس که:
مسیر نسبی
مسیر کاری فعلی را چاپ کند.
مسیر را با
بررسی کند مسیر مطلق است یا نه.
خروجی باید شامل این سه مورد باشد:
پست ۱۴۸ از دوره جامع Python 🐍
مسیرهای مطلق و نسبی با
pathlibدر پستهای قبل بیشتر با مسیرهایی مثل:
Path("data/users.txt")کار کردیم.
این نوع مسیر یک مسیر نسبی (Relative Path) است.
حالا باید تفاوت مسیر نسبی و مسیر مطلق (Absolute Path) را یاد بگیریم.
🔹 مسیر نسبی چیست؟
مسیر نسبی از پوشه کاری فعلی برنامه محاسبه میشود.
مثلاً:
from pathlib import Path
file = Path("data/users.txt")
print(file)
این مسیر میگوید:
پوشه فعلی
└── data
└── users.txt
اگر پوشه کاری برنامه تغییر کند، محل این فایل هم میتواند متفاوت باشد.
🔹 مسیر مطلق چیست؟
مسیر مطلق، آدرس کامل فایل یا پوشه را مشخص میکند.
مثلاً در Windows:
from pathlib import Path
file = Path("C:/Users/Ali/project/data/users.txt")
print(file.is_absolute())
خروجی:
True
مسیر مطلق دیگر به پوشه کاری فعلی وابسته نیست.
🔹 بررسی مطلق یا نسبی بودن مسیر
با:
path.is_absolute()
میتوانیم بررسی کنیم مسیر مطلق است یا نه.
مثلاً:
from pathlib import Path
relative = Path("data/users.txt")
absolute = Path("C:/project/data/users.txt")
print(relative.is_absolute())
print(absolute.is_absolute())
خروجی:
False
True
🔹 تبدیل مسیر نسبی به مسیر مطلق
با
resolve() میتوانیم مسیر را به مسیر مطلق تبدیل کنیم:from pathlib import Path
path = Path("data/users.txt")
absolute_path = path.resolve()
print(absolute_path)
مثلاً ممکن است خروجی چیزی شبیه این باشد:
C:\Users\Ali\project\data\users.txt
مسیر دقیق به محل اجرای برنامه بستگی دارد.
🔹 پیدا کردن پوشه کاری فعلی
میتوانیم مسیر کاری فعلی را با:
Path.cwd()
ببینیم:
from pathlib import Path
current = Path.cwd()
print(current)
مثلاً:
C:\Users\Ali\project
این همان مسیری است که مسیرهای نسبی معمولاً نسبت به آن تفسیر میشوند.
🔹 ساخت مسیر نسبت به پوشه کاری
میتوانیم مسیر فعلی را با مسیر دیگری ترکیب کنیم:
from pathlib import Path
base = Path.cwd()
file = base / "data" / "users.txt"
print(file)
⚠️ نکته مهم
مسیر نسبی همیشه بد نیست.
برای پروژههایی که ساختار مشخصی دارند، مسیر نسبی میتواند بسیار مناسب باشد:
project/
├── main.py
└── data/
└── users.txt
مثلاً:
Path("data/users.txt")خواناتر از یک مسیر مطلق طولانی است.
اما مسیر مطلق برای بعضی کاربردها لازم است؛ مخصوصاً زمانی که باید دقیقاً یک محل مشخص در سیستم فایل را مشخص کنیم.
🔥 مثال مقایسهای
مسیر نسبی:
Path("data/users.txt")مسیر مطلق:
Path("C:/Users/Ali/project/data/users.txt")اولی به محیط اجرای برنامه وابسته است.
دومی محل دقیق فایل را مشخص میکند.
🧠 خلاصه
Relative Path
→ مسیر نسبت به پوشه کاری فعلی
Absolute Path
→ مسیر کامل و مستقل از پوشه کاری
Path.cwd()
→ مسیر کاری فعلی
is_absolute()
→ بررسی مطلق بودن مسیر
resolve()
→ تبدیل مسیر به مسیر مطلق
🎯 تمرین
کدی بنویس که:
مسیر نسبی
data/users.txt را ایجاد کند.مسیر کاری فعلی را چاپ کند.
مسیر را با
resolve() به مسیر مطلق تبدیل کند.بررسی کند مسیر مطلق است یا نه.
خروجی باید شامل این سه مورد باشد:
Current directory: ...
Absolute path: ...
Is absolute: True
پست ۱۴۸ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۴۹
مسیر والد و اجزای مسیر با
در پستهای قبل با مسیر نسبی، مسیر مطلق و
حالا میخواهیم یاد بگیریم چطور بخشهای مختلف یک مسیر را جدا کنیم.
🔹 مسیر والد با
فرض کنیم:
خروجی:
🔹 چند سطح والد
میتوانیم به والدهای بالاتر هم دسترسی داشته باشیم:
خروجی:
در این مثال:
🔹 نام فایل با
برای دریافت نام کامل فایل:
خروجی:
🔹 نام بدون پسوند با
خروجی:
🔹 پسوند با
خروجی:
🔹 تمام پسوندها با
گاهی فایل چند پسوند دارد:
خروجی:
پس:
🔹 بخشهای مسیر با
با
خروجی:
هر بخش مسیر بهصورت یک عضو جداگانه در اختیار ما قرار میگیرد.
🔥 مثال کاربردی
فرض کنیم کاربر یک مسیر فایل را وارد میکند:
خروجی:
⚠️ نکته مهم
این ویژگیها اطلاعات مسیر را استخراج میکنند؛ فایل یا پوشهای ایجاد یا حذف نمیکنند.
مثلاً:
فقط مسیر والد را به ما میدهد.
برای ساخت آن باید از:
استفاده کنیم.
🧠 خلاصه
مثلاً برای:
داریم:
🎯 تمرین
مسیر زیر را در نظر بگیر:
برنامهای بنویس که موارد زیر را چاپ کند:
پست ۱۴۹ از دوره جامع Python 🐍
مسیر والد و اجزای مسیر با
pathlibدر پستهای قبل با مسیر نسبی، مسیر مطلق و
resolve() آشنا شدیم.حالا میخواهیم یاد بگیریم چطور بخشهای مختلف یک مسیر را جدا کنیم.
🔹 مسیر والد با
parentفرض کنیم:
from pathlib import Path
path = Path("project/data/users.txt")
print(path.parent)
خروجی:
project/data
parent پوشهای را نشان میدهد که فایل یا مسیر موردنظر داخل آن قرار دارد.🔹 چند سطح والد
میتوانیم به والدهای بالاتر هم دسترسی داشته باشیم:
from pathlib import Path
path = Path("project/data/users.txt")
print(path.parent)
print(path.parent.parent)
print(path.parent.parent.parent)
خروجی:
project/data
project
.
در این مثال:
users.txt
↓
data
↓
project
🔹 نام فایل با
nameبرای دریافت نام کامل فایل:
from pathlib import Path
path = Path("project/data/users.txt")
print(path.name)
خروجی:
users.txt
🔹 نام بدون پسوند با
stemprint(path.stem)
خروجی:
users
🔹 پسوند با
suffixprint(path.suffix)
خروجی:
.txt
🔹 تمام پسوندها با
suffixesگاهی فایل چند پسوند دارد:
from pathlib import Path
path = Path("backup.tar.gz")
print(path.suffix)
print(path.suffixes)
خروجی:
.gz
['.tar', '.gz']
پس:
suffix → آخرین پسوند
suffixes → تمام پسوندها
🔹 بخشهای مسیر با
partsبا
parts میتوانیم مسیر را به اجزای جداگانه تقسیم کنیم:from pathlib import Path
path = Path("project/data/users.txt")
print(path.parts)
خروجی:
('project', 'data', 'users.txt')هر بخش مسیر بهصورت یک عضو جداگانه در اختیار ما قرار میگیرد.
🔥 مثال کاربردی
فرض کنیم کاربر یک مسیر فایل را وارد میکند:
from pathlib import Path
path = Path("project/data/report.pdf")
print("File:", path.name)
print("Folder:", path.parent)
print("Extension:", path.suffix)
خروجی:
File: report.pdf
Folder: project/data
Extension: .pdf
⚠️ نکته مهم
این ویژگیها اطلاعات مسیر را استخراج میکنند؛ فایل یا پوشهای ایجاد یا حذف نمیکنند.
مثلاً:
path.parent
فقط مسیر والد را به ما میدهد.
برای ساخت آن باید از:
path.parent.mkdir(parents=True, exist_ok=True)
استفاده کنیم.
🧠 خلاصه
parent → پوشه والد
name → نام کامل فایل
stem → نام بدون پسوند
suffix → آخرین پسوند
suffixes → تمام پسوندها
parts → اجزای مسیر
مثلاً برای:
Path("project/data/report.tar.gz")داریم:
parent → project/data
name → report.tar.gz
stem → report.tar
suffix → .gz
suffixes → ['.tar', '.gz']
🎯 تمرین
مسیر زیر را در نظر بگیر:
path = Path("project/data/backups/database.sql.gz")برنامهای بنویس که موارد زیر را چاپ کند:
نام کامل فایل
پوشه والد
نام فایل
آخرین پسوند
تمام پسوندها
اجزای مسیر
پست ۱۴۹ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۵۰
تغییر نام و جایگزینی مسیرها با
در پستهای قبل با کپی، انتقال و حذف فایلها آشنا شدیم.
حالا میخواهیم دو عملیات مهم دیگر را با
🔹 تغییر نام فایل با
فرض کنیم فایل زیر را داریم:
میتوانیم نام آن را تغییر دهیم:
حالا ساختار فایل:
خواهد بود.
🔹 تغییر نام پوشه
میتوانیم نام یک پوشه را هم تغییر دهیم:
حالا:
داریم.
🔹 انتقال فایل با
اگر پوشه
⚠️
بنابراین اگر لازم است:
🔹
اگر مسیر مقصد از قبل وجود داشته باشد، آن را جایگزین میکند.
اگر
🔥 تفاوت
بهصورت ساده:
به همین دلیل
🔹 مثال کاربردی: جایگزینی فایل تنظیمات
فرض کنیم برنامه یک فایل تنظیمات جدید ساخته است:
میتوانیم نسخه جدید را جایگزین نسخه فعلی کنیم:
بعد از اجرا:
نسخه جدید جایگزین فایل قبلی شده است.
⚠️ نکته مهم
قبل از استفاده از
مثلاً:
اگر
پس برای عملیات حساس، مسیر مقصد را با دقت مشخص کن.
🧠 خلاصه
برای:
و:
برای:
همچنین:
برای ساخت پوشه مقصد در صورت نیاز کاربرد دارد.
🎯 تمرین
ساختار زیر را در نظر بگیر:
برنامهای بنویس که:
یک فایل جدید به نام
در پایان بررسی کند که
پست ۱۵۰ از دوره جامع Python 🐍
تغییر نام و جایگزینی مسیرها با
Path.rename() و Path.replace()در پستهای قبل با کپی، انتقال و حذف فایلها آشنا شدیم.
حالا میخواهیم دو عملیات مهم دیگر را با
pathlib یاد بگیریم:rename()
replace()
🔹 تغییر نام فایل با
rename()فرض کنیم فایل زیر را داریم:
data/
└── old_name.txt
میتوانیم نام آن را تغییر دهیم:
from pathlib import Path
file = Path("data/old_name.txt")
new_file = file.rename("data/new_name.txt")
print(new_file)
حالا ساختار فایل:
data/
└── new_name.txt
خواهد بود.
rename() یک شیء Path مربوط به مسیر جدید را برمیگرداند.🔹 تغییر نام پوشه
rename() فقط برای فایل نیست.میتوانیم نام یک پوشه را هم تغییر دهیم:
from pathlib import Path
folder = Path("data/old")
new_folder = folder.rename("data/new")
print(new_folder)
حالا:
data/
└── new/
داریم.
🔹 انتقال فایل با
rename()rename() میتواند فایل را به مسیر دیگری نیز منتقل کند:from pathlib import Path
file = Path("data/users.txt")
file.rename("backup/users.txt")
اگر پوشه
backup از قبل وجود داشته باشد، فایل به آنجا منتقل میشود.⚠️
rename() خودش پوشه مقصد را ایجاد نمیکند.بنابراین اگر لازم است:
from pathlib import Path
file = Path("data/users.txt")
destination = Path("backup/users.txt")
destination.parent.mkdir(parents=True, exist_ok=True)
file.rename(destination)
🔹
replace() چیست؟replace() شبیه rename() است، اما یک تفاوت مهم دارد:اگر مسیر مقصد از قبل وجود داشته باشد، آن را جایگزین میکند.
from pathlib import Path
source = Path("data/new.txt")
destination = Path("data/current.txt")
source.replace(destination)
اگر
current.txt وجود داشته باشد، با new.txt جایگزین میشود.🔥 تفاوت
rename() و replace()بهصورت ساده:
rename()
→ تغییر نام یا جابهجایی مسیر
replace()
→ تغییر مسیر + جایگزین کردن مقصد در صورت وجود
به همین دلیل
replace() را باید با دقت بیشتری استفاده کرد.🔹 مثال کاربردی: جایگزینی فایل تنظیمات
فرض کنیم برنامه یک فایل تنظیمات جدید ساخته است:
data/
├── config.json
└── config_new.json
میتوانیم نسخه جدید را جایگزین نسخه فعلی کنیم:
from pathlib import Path
new_config = Path("data/config_new.json")
current_config = Path("data/config.json")
new_config.replace(current_config)
بعد از اجرا:
data/
└── config.json
نسخه جدید جایگزین فایل قبلی شده است.
⚠️ نکته مهم
قبل از استفاده از
replace() باید بدانیم که مقصد ممکن است جایگزین شود.مثلاً:
source.replace(destination)
اگر
destination وجود داشته باشد، محتوای قبلی آن دیگر در همان مسیر باقی نمیماند.پس برای عملیات حساس، مسیر مقصد را با دقت مشخص کن.
🧠 خلاصه
file.rename(new_path)
برای:
تغییر نام
انتقال
و:
file.replace(new_path)
برای:
انتقال/تغییر نام
+
جایگزینی مقصد در صورت وجود
همچنین:
destination.parent.mkdir(
parents=True,
exist_ok=True
)
برای ساخت پوشه مقصد در صورت نیاز کاربرد دارد.
🎯 تمرین
ساختار زیر را در نظر بگیر:
project/
└── data/
├── old.txt
└── final.txt
برنامهای بنویس که:
old.txt را به new.txt تغییر نام دهد.یک فایل جدید به نام
latest.txt ایجاد کند.new.txt را با latest.txt جایگزین کند.در پایان بررسی کند که
latest.txt وجود دارد.پست ۱۵۰ از دوره جامع Python 🐍
🐍 پروژه اول دوره Python
سیستم مدیریت اطلاعات کاربران با فایلها
تبریک! 🎉
تا اینجا ۱۵۰ پست از دوره جامع Python را پشت سر گذاشتیم.
حالا وقت آن رسیده که چیزهایی که یاد گرفتیم را در یک پروژه واقعی استفاده کنیم.
📌 پروژه: سیستم مدیریت کاربران
یک برنامه بنویسید که بتواند اطلاعات کاربران را ذخیره، نمایش، جستجو و مدیریت کند.
اطلاعات هر کاربر:
🎯 قابلیتهای موردنیاز
1️⃣ ساخت پوشه پروژه
برنامه باید در اولین اجرا ساختار زیر را ایجاد کند:
اگر پوشهها وجود نداشتند، برنامه باید خودش آنها را بسازد.
2️⃣ اضافه کردن کاربر
کاربر بتواند اطلاعات جدید وارد کند:
مثال:
و اطلاعات داخل فایل ذخیره شود.
3️⃣ نمایش تمام کاربران
برنامه باید اطلاعات ذخیرهشده را از فایل بخواند و نمایش دهد.
مثال خروجی:
4️⃣ جستجوی کاربر
کاربر بتواند با نام، کاربر موردنظر را پیدا کند.
مثلاً:
خروجی:
5️⃣ حذف کاربر
امکان حذف یک کاربر وجود داشته باشد.
بعد از حذف، فایل اصلی باید با اطلاعات جدید ذخیره شود.
6️⃣ تهیه نسخه پشتیبان
یک گزینه برای Backup قرار دهید.
برنامه باید فایل:
را به پوشه:
کپی کند.
📚 مباحثی که باید استفاده کنید
در این پروژه از مباحث زیر استفاده کنید:
✅ متغیرها
✅ شرطها (
✅ حلقهها
✅ توابع
✅ لیستها و دیکشنریها
✅ کار با رشتهها
✅ مدیریت خطا (
✅ کار با فایلها
✅
✅ ساخت پوشهها
✅ خواندن و نوشتن فایل
✅ کپی فایلها با
⭐️ امکانات اضافی (اختیاری)
اگر خواستید پروژه را حرفهایتر کنید:
🔹 منوی متنی برای برنامه بسازید:
🔹 جلوگیری از ثبت ایمیل تکراری
🔹 بررسی معتبر بودن سن
🔹 ذخیره زمان ثبت کاربر
🔹 استفاده از JSON به جای فایل متنی
📌 قوانین ارسال پروژه
هنگام انجام پروژه:
کد را کامل بنویسید.
برای بخشهای مهم توضیح کوتاه داخل کد قرار دهید.
اگر خطایی دریافت کردید، متن خطا و کد مربوطه را ارسال کنید.
منتظر پروژههای شما هستیم 🐍🔥
اولین پروژه عملی دوره جامع Python
سیستم مدیریت اطلاعات کاربران با فایلها
تبریک! 🎉
تا اینجا ۱۵۰ پست از دوره جامع Python را پشت سر گذاشتیم.
حالا وقت آن رسیده که چیزهایی که یاد گرفتیم را در یک پروژه واقعی استفاده کنیم.
📌 پروژه: سیستم مدیریت کاربران
یک برنامه بنویسید که بتواند اطلاعات کاربران را ذخیره، نمایش، جستجو و مدیریت کند.
اطلاعات هر کاربر:
نام
سن
ایمیل
شماره تماس
🎯 قابلیتهای موردنیاز
1️⃣ ساخت پوشه پروژه
برنامه باید در اولین اجرا ساختار زیر را ایجاد کند:
UserManager/
│
├── data/
│ └── users.txt
│
└── backup/
اگر پوشهها وجود نداشتند، برنامه باید خودش آنها را بسازد.
2️⃣ اضافه کردن کاربر
کاربر بتواند اطلاعات جدید وارد کند:
مثال:
Name: Ali
Age: 25
Email: ali@example.com
Phone: 09123456789
و اطلاعات داخل فایل ذخیره شود.
3️⃣ نمایش تمام کاربران
برنامه باید اطلاعات ذخیرهشده را از فایل بخواند و نمایش دهد.
مثال خروجی:
----------------
User 1
Name: Ali
Age: 25
Email: ali@example.com
Phone: 09123456789
----------------
4️⃣ جستجوی کاربر
کاربر بتواند با نام، کاربر موردنظر را پیدا کند.
مثلاً:
Search name: Ali
خروجی:
User found:
Ali
25
ali@example.com
5️⃣ حذف کاربر
امکان حذف یک کاربر وجود داشته باشد.
بعد از حذف، فایل اصلی باید با اطلاعات جدید ذخیره شود.
6️⃣ تهیه نسخه پشتیبان
یک گزینه برای Backup قرار دهید.
برنامه باید فایل:
users.txt
را به پوشه:
backup/
کپی کند.
📚 مباحثی که باید استفاده کنید
در این پروژه از مباحث زیر استفاده کنید:
✅ متغیرها
✅ شرطها (
if / elif / else)✅ حلقهها
✅ توابع
✅ لیستها و دیکشنریها
✅ کار با رشتهها
✅ مدیریت خطا (
try/except)✅ کار با فایلها
✅
pathlib✅ ساخت پوشهها
✅ خواندن و نوشتن فایل
✅ کپی فایلها با
shutil⭐️ امکانات اضافی (اختیاری)
اگر خواستید پروژه را حرفهایتر کنید:
🔹 منوی متنی برای برنامه بسازید:
1. Add User
2. Show Users
3. Search User
4. Delete User
5. Backup
6. Exit
🔹 جلوگیری از ثبت ایمیل تکراری
🔹 بررسی معتبر بودن سن
🔹 ذخیره زمان ثبت کاربر
🔹 استفاده از JSON به جای فایل متنی
📌 قوانین ارسال پروژه
هنگام انجام پروژه:
کد را کامل بنویسید.
برای بخشهای مهم توضیح کوتاه داخل کد قرار دهید.
اگر خطایی دریافت کردید، متن خطا و کد مربوطه را ارسال کنید.
منتظر پروژههای شما هستیم 🐍🔥
اولین پروژه عملی دوره جامع Python
1
🐍 آموزش جامع Python — پست ۱۵۱
کار با JSON در Python
در پروژه قبلی اطلاعات کاربران را داخل فایل ذخیره کردیم.
اما فایل متنی برای ذخیره اطلاعات ساختاریافته چندان مناسب نیست.
برای مثال، اگر بخواهیم اطلاعات یک کاربر را ذخیره کنیم:
خواندن و مدیریت این اطلاعات به شکل دستی سختتر میشود.
اینجاست که JSON کاربرد پیدا میکند.
🔹 JSON چیست؟
JSON یک قالب متنی استاندارد برای ذخیره و انتقال دادههای ساختاریافته است.
مثلاً اطلاعات یک کاربر میتواند به این شکل باشد:
ساختار JSON شباهت زیادی به
🔹 تبدیل Dictionary به JSON
برای کار با JSON از ماژول داخلی
خروجی:
🔹 خواناتر کردن JSON
میتوانیم JSON را مرتبتر نمایش دهیم:
خروجی:
🔹 تبدیل JSON به Dictionary
برعکس
خروجی:
پس:
⚠️ نکته مهم
JSON خودش یک
مثلاً:
یک
اما:
یک
میتوانیم تفاوت آنها را ببینیم:
خروجی:
🧠 خلاصه
در پست بعدی یاد میگیریم چطور JSON را مستقیماً داخل فایل ذخیره و دوباره از فایل بخوانیم.
🎯 تمرین
Dictionary زیر را به JSON تبدیل کن:
آن را با
پست ۱۵۱ از دوره جامع Python 🐍
کار با JSON در Python
در پروژه قبلی اطلاعات کاربران را داخل فایل ذخیره کردیم.
اما فایل متنی برای ذخیره اطلاعات ساختاریافته چندان مناسب نیست.
برای مثال، اگر بخواهیم اطلاعات یک کاربر را ذخیره کنیم:
Name: Ali
Age: 25
Email: ali@example.com
خواندن و مدیریت این اطلاعات به شکل دستی سختتر میشود.
اینجاست که JSON کاربرد پیدا میکند.
🔹 JSON چیست؟
JSON یک قالب متنی استاندارد برای ذخیره و انتقال دادههای ساختاریافته است.
مثلاً اطلاعات یک کاربر میتواند به این شکل باشد:
{
"name": "Ali",
"age": 25,
"email": "ali@example.com"
}ساختار JSON شباهت زیادی به
dict در Python دارد.🔹 تبدیل Dictionary به JSON
برای کار با JSON از ماژول داخلی
json استفاده میکنیم:import json
user = {
"name": "Ali",
"age": 25,
"email": "ali@example.com"
}
data = json.dumps(user)
print(data)
خروجی:
{"name": "Ali", "age": 25, "email": "ali@example.com"}dumps() داده Python را به رشته JSON تبدیل میکند.🔹 خواناتر کردن JSON
میتوانیم JSON را مرتبتر نمایش دهیم:
import json
user = {
"name": "Ali",
"age": 25,
"email": "ali@example.com"
}
data = json.dumps(user, indent=4)
print(data)
خروجی:
{
"name": "Ali",
"age": 25,
"email": "ali@example.com"
}indent=4 باعث میشود خروجی خواناتر شود.🔹 تبدیل JSON به Dictionary
برعکس
dumps()، با loads() میتوانیم یک رشته JSON را دوباره به Python تبدیل کنیم:import json
text = '{"name": "Ali", "age": 25}'
user = json.loads(text)
print(user)
print(user["name"])
خروجی:
{'name': 'Ali', 'age': 25}
Aliپس:
dict → json.dumps() → JSON string
JSON string → json.loads() → dict
⚠️ نکته مهم
JSON خودش یک
dict پایتون نیست.مثلاً:
user = {
"name": "Ali"
}یک
dict است.اما:
text = '{"name": "Ali"}'یک
str است که محتوایش با قالب JSON نوشته شده.میتوانیم تفاوت آنها را ببینیم:
print(type(user))
print(type(text))
خروجی:
<class 'dict'>
<class 'str'>
🧠 خلاصه
json.dumps()
Python object → JSON string
json.loads()
JSON string → Python object
در پست بعدی یاد میگیریم چطور JSON را مستقیماً داخل فایل ذخیره و دوباره از فایل بخوانیم.
🎯 تمرین
Dictionary زیر را به JSON تبدیل کن:
import json
product = {
"name": "Laptop",
"price": 1200,
"available": True
}
آن را با
json.dumps() به JSON تبدیل کن و با indent=4 نمایش بده.پست ۱۵۱ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۵۲
ذخیره و خواندن JSON از فایل
در پست قبل یاد گرفتیم چگونه بین
اما در برنامههای واقعی معمولاً اطلاعات را داخل فایل ذخیره میکنیم تا بعداً دوباره بتوانیم از آنها استفاده کنیم.
برای این کار از:
استفاده میکنیم.
🔹 ذخیره Dictionary داخل فایل JSON
بعد از اجرا فایل:
ساخته میشود.
🔹 خواندن JSON از فایل
بعد از
🎯 پاسخ کامل تمرین
ذخیره و خواندن محصولات با JSON
کد کامل:
خروجی:
توضیح کد:
ابتدا لیست محصولات را ساختیم:
سپس با:
آن را داخل فایل:
ذخیره کردیم.
بعد با:
اطلاعات فایل را دوباره خواندیم.
در آخر با حلقه:
روی تمام محصولات حرکت کردیم و نام آنها را چاپ کردیم.
نسخه بهتر با مدیریت خطا:
اینجا اگر:
فایل وجود نداشته باشد
ساختار JSON خراب باشد
برنامه بهجای متوقف شدن، خطا را مدیریت میکند.
پست ۱۵۲ از دوره جامع Python 🐍
ذخیره و خواندن JSON از فایل
در پست قبل یاد گرفتیم چگونه بین
dict و JSON تبدیل انجام دهیم.اما در برنامههای واقعی معمولاً اطلاعات را داخل فایل ذخیره میکنیم تا بعداً دوباره بتوانیم از آنها استفاده کنیم.
برای این کار از:
json.dump()
json.load()
استفاده میکنیم.
🔹 ذخیره Dictionary داخل فایل JSON
import json
user = {
"name": "Ali",
"age": 25,
"email": "ali@example.com"
}
with open("user.json", "w", encoding="utf-8") as file:
json.dump(user, file, indent=4)
بعد از اجرا فایل:
user.json
ساخته میشود.
🔹 خواندن JSON از فایل
import json
with open("user.json", "r", encoding="utf-8") as file:
user = json.load(file)
print(user)
بعد از
load() داده دوباره به شکل dict در Python برمیگردد.🎯 پاسخ کامل تمرین
ذخیره و خواندن محصولات با JSON
کد کامل:
import json
products = [
{
"name": "Laptop",
"price": 1200
},
{
"name": "Mouse",
"price": 25
}
]
# ذخیره محصولات داخل فایل JSON
with open("products.json", "w", encoding="utf-8") as file:
json.dump(
products,
file,
indent=4
)
# خواندن محصولات از فایل JSON
with open("products.json", "r", encoding="utf-8") as file:
loaded_products = json.load(file)
# نمایش نام محصولات
for product in loaded_products:
print(product["name"])
خروجی:
Laptop
Mouse
توضیح کد:
ابتدا لیست محصولات را ساختیم:
products = [...]
سپس با:
json.dump()
آن را داخل فایل:
products.json
ذخیره کردیم.
بعد با:
json.load()
اطلاعات فایل را دوباره خواندیم.
در آخر با حلقه:
for product in loaded_products:
روی تمام محصولات حرکت کردیم و نام آنها را چاپ کردیم.
نسخه بهتر با مدیریت خطا:
import json
try:
with open("products.json", "r", encoding="utf-8") as file:
products = json.load(file)
for product in products:
print(product["name"])
except FileNotFoundError:
print("File not found")
except json.JSONDecodeError:
print("Invalid JSON file")
اینجا اگر:
فایل وجود نداشته باشد
ساختار JSON خراب باشد
برنامه بهجای متوقف شدن، خطا را مدیریت میکند.
پست ۱۵۲ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۵۳
مدیریت فایل JSON با
در پستهای قبل با
حالا میخواهیم ترکیب:
را استفاده کنیم تا مدیریت فایلهای JSON حرفهایتر شود.
🔹 باز کردن فایل JSON با
🎯 پاسخ کامل تمرین
ساخت فایل تنظیمات JSON
هدف:
ساخت مسیر:
ذخیره تنظیمات:
و خواندن مقدار
کد کامل:
خروجی:
توضیح بخشهای مهم:
ساخت مسیر:
فایل را داخل پوشه مشخص قرار میدهد.
ساخت پوشهها:
اگر:
وجود نداشته باشند، آنها را ایجاد میکند.
ذخیره اطلاعات:
Dictionary پایتون را به فایل JSON تبدیل میکند.
خواندن اطلاعات:
فایل JSON را دوباره به Dictionary تبدیل میکند.
دسترسی به مقدار:
مقدار کلید
نسخه همراه با مدیریت خطا:
پست ۱۵۳ از دوره جامع Python 🐍
مدیریت فایل JSON با
pathlibدر پستهای قبل با
json.dump() و json.load() آشنا شدیم.حالا میخواهیم ترکیب:
pathlib + json
را استفاده کنیم تا مدیریت فایلهای JSON حرفهایتر شود.
🔹 باز کردن فایل JSON با
Pathfrom pathlib import Path
import json
file = Path("data/users.json")
users = [
{
"name": "Ali",
"age": 25
}
]
with file.open("w", encoding="utf-8") as f:
json.dump(users, f, indent=4)
🎯 پاسخ کامل تمرین
ساخت فایل تنظیمات JSON
هدف:
ساخت مسیر:
app/
└── data/
└── settings.json
ذخیره تنظیمات:
{
"language": "fa",
"theme": "dark",
"notifications": True
}و خواندن مقدار
theme.کد کامل:
from pathlib import Path
import json
# ساخت مسیر فایل
file = Path("app/data/settings.json")
# ساخت پوشههای والد
file.parent.mkdir(
parents=True,
exist_ok=True
)
# اطلاعات تنظیمات
settings = {
"language": "fa",
"theme": "dark",
"notifications": True
}
# ذخیره JSON داخل فایل
with file.open(
"w",
encoding="utf-8"
) as f:
json.dump(
settings,
f,
indent=4,
ensure_ascii=False
)
# خواندن فایل JSON
with file.open(
"r",
encoding="utf-8"
) as f:
loaded_settings = json.load(f)
# نمایش مقدار theme
print(loaded_settings["theme"])
خروجی:
dark
توضیح بخشهای مهم:
ساخت مسیر:
file = Path("app/data/settings.json")فایل را داخل پوشه مشخص قرار میدهد.
ساخت پوشهها:
file.parent.mkdir(
parents=True,
exist_ok=True
)
اگر:
app
data
وجود نداشته باشند، آنها را ایجاد میکند.
ذخیره اطلاعات:
json.dump(settings, f)
Dictionary پایتون را به فایل JSON تبدیل میکند.
خواندن اطلاعات:
json.load(f)
فایل JSON را دوباره به Dictionary تبدیل میکند.
دسترسی به مقدار:
loaded_settings["theme"]
مقدار کلید
theme را برمیگرداند.نسخه همراه با مدیریت خطا:
from pathlib import Path
import json
file = Path("app/data/settings.json")
try:
file.parent.mkdir(
parents=True,
exist_ok=True
)
settings = {
"language": "fa",
"theme": "dark",
"notifications": True
}
with file.open("w", encoding="utf-8") as f:
json.dump(
settings,
f,
indent=4,
ensure_ascii=False
)
with file.open("r", encoding="utf-8") as f:
data = json.load(f)
print(data["theme"])
except PermissionError:
print("Permission denied")
except json.JSONDecodeError:
print("Invalid JSON file")
پست ۱۵۳ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۵۴
مدیریت خطا هنگام کار با فایلهای JSON
در پستهای قبل یاد گرفتیم چگونه فایلهای JSON را ذخیره و بخوانیم.
اما در برنامههای واقعی همیشه همه چیز طبق انتظار پیش نمیرود.
ممکن است:
فایل وجود نداشته باشد.
ساختار JSON خراب شده باشد.
دسترسی به فایل نداشته باشیم.
فایل خالی باشد.
برای جلوگیری از متوقف شدن برنامه از:
استفاده میکنیم.
🔹 خطای نبودن فایل
فرض کنیم میخواهیم یک فایل را بخوانیم:
اگر فایل وجود نداشته باشد:
دریافت میکنیم.
برای مدیریت:
حالا برنامه متوقف نمیشود.
🔹 JSON خراب
فرض کنیم فایل:
باشد.
این JSON ناقص است.
در هنگام خواندن:
خطای:
ایجاد میشود.
مدیریت آن:
🔹 مدیریت چند خطا با هم
میتوانیم چند خطا را جداگانه مدیریت کنیم:
هر خطا پیام مناسب خودش را دارد.
🔹 استفاده از
در
کد داخل
🔹 استفاده از
گاهی میخواهیم بخشی از کد همیشه اجرا شود.
برای این کار از:
استفاده میکنیم.
مثلاً:
بخش
🔥 مثال کامل با
اینجا سه مشکل مختلف مدیریت شده است:
🧠 خلاصه
🎯 تمرین
برنامهای بنویس که:
فایل:
را بخواند.
مقدار:
را دریافت کند.
خطاهای زیر را مدیریت کند:
نبودن فایل
خراب بودن JSON
نبودن کلید
خروجی موفق:
پست ۱۵۴ از دوره جامع Python 🐍
مدیریت خطا هنگام کار با فایلهای JSON
در پستهای قبل یاد گرفتیم چگونه فایلهای JSON را ذخیره و بخوانیم.
اما در برنامههای واقعی همیشه همه چیز طبق انتظار پیش نمیرود.
ممکن است:
فایل وجود نداشته باشد.
ساختار JSON خراب شده باشد.
دسترسی به فایل نداشته باشیم.
فایل خالی باشد.
برای جلوگیری از متوقف شدن برنامه از:
try
except
استفاده میکنیم.
🔹 خطای نبودن فایل
فرض کنیم میخواهیم یک فایل را بخوانیم:
import json
with open("settings.json", "r") as file:
data = json.load(file)
اگر فایل وجود نداشته باشد:
FileNotFoundError
دریافت میکنیم.
برای مدیریت:
import json
try:
with open("settings.json", "r") as file:
data = json.load(file)
except FileNotFoundError:
print("File does not exist")
حالا برنامه متوقف نمیشود.
🔹 JSON خراب
فرض کنیم فایل:
{
"name": "Ali",
"age": 25باشد.
این JSON ناقص است.
در هنگام خواندن:
json.load(file)
خطای:
JSONDecodeError
ایجاد میشود.
مدیریت آن:
import json
try:
with open("user.json", "r") as file:
user = json.load(file)
except json.JSONDecodeError:
print("Invalid JSON format")
🔹 مدیریت چند خطا با هم
میتوانیم چند خطا را جداگانه مدیریت کنیم:
import json
try:
with open("user.json", "r", encoding="utf-8") as file:
user = json.load(file)
except FileNotFoundError:
print("File not found")
except json.JSONDecodeError:
print("JSON is invalid")
except PermissionError:
print("No permission to access file")
هر خطا پیام مناسب خودش را دارد.
🔹 استفاده از
elseدر
try/except میتوانیم از else هم استفاده کنیم.کد داخل
else فقط زمانی اجرا میشود که خطایی رخ نداده باشد:import json
try:
with open("user.json", "r") as file:
user = json.load(file)
except FileNotFoundError:
print("File not found")
else:
print(user)
🔹 استفاده از
finallyگاهی میخواهیم بخشی از کد همیشه اجرا شود.
برای این کار از:
finally
استفاده میکنیم.
مثلاً:
try:
file = open("user.json", "r")
data = file.read()
except FileNotFoundError:
print("File not found")
finally:
print("Operation finished")
بخش
finally چه خطا رخ بدهد چه ندهد اجرا میشود.🔥 مثال کامل با
pathlibfrom pathlib import Path
import json
file = Path("data/settings.json")
try:
with file.open("r", encoding="utf-8") as f:
settings = json.load(f)
print(settings["theme"])
except FileNotFoundError:
print("Settings file not found")
except json.JSONDecodeError:
print("Invalid JSON data")
except KeyError:
print("Theme key does not exist")
اینجا سه مشکل مختلف مدیریت شده است:
FileNotFoundError
→ فایل وجود ندارد
JSONDecodeError
→ ساختار JSON خراب است
KeyError
→ کلید موردنظر وجود ندارد
🧠 خلاصه
FileNotFoundError
→ فایل پیدا نشد
JSONDecodeError
→ JSON خراب است
PermissionError
→ دسترسی وجود ندارد
KeyError
→ کلید Dictionary وجود ندارد
try/except
→ جلوگیری از توقف برنامه
🎯 تمرین
برنامهای بنویس که:
فایل:
data/config.json
را بخواند.
مقدار:
{
"theme": "dark"
}را دریافت کند.
خطاهای زیر را مدیریت کند:
نبودن فایل
خراب بودن JSON
نبودن کلید
themeخروجی موفق:
dark
پست ۱۵۴ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۵۵
ساخت سیستم تنظیمات برنامه با JSON
در پستهای قبل یاد گرفتیم چگونه اطلاعات را در فایل JSON ذخیره کنیم و خطاهای مربوط به آن را مدیریت کنیم.
حالا میخواهیم از این قابلیت برای ساخت یک سیستم تنظیمات واقعی برنامه استفاده کنیم.
بسیاری از برنامهها اطلاعاتی مثل:
را در یک فایل تنظیمات ذخیره میکنند.
🔹 ساختار پروژه
ساختار پیشنهادی:
فایل:
تنظیمات برنامه را نگهداری میکند.
🔹 ایجاد فایل تنظیمات پیشفرض
ابتدا یک تابع برای ساخت تنظیمات ایجاد میکنیم:
اگر پوشه یا فایل وجود نداشته باشد، ساخته میشود.
🔹 خواندن تنظیمات
حالا یک تابع برای خواندن تنظیمات:
استفاده:
خروجی:
🔹 تغییر تنظیمات
فرض کنیم کاربر میخواهد حالت نمایش را تغییر دهد:
استفاده:
حالا فایل:
خواهد بود.
🔹 بررسی وجود فایل تنظیمات
در برنامه واقعی بهتر است قبل از خواندن بررسی کنیم فایل وجود دارد یا نه:
یعنی:
اگر تنظیمات وجود ندارد → ایجاد کن.
اگر وجود دارد → بخوان.
🔥 مثال کامل
خروجی:
⚠️ نکته مهم
فایل تنظیمات معمولاً اطلاعاتی مثل:
رمز عبور
کلید API
اطلاعات حساس
را نباید بدون رمزنگاری ذخیره کند.
JSON فقط یک روش ذخیرهسازی است و امنیت داخلی ندارد.
🧠 خلاصه
🎯 تمرین
یک سیستم تنظیمات ساده بسازید:
قابلیتها:
اگر فایل:
وجود نداشت، آن را بسازد.
تنظیمات پیشفرض:
را ذخیره کند.
تنظیمات را بخواند.
مقدار
خروجی:
پست ۱۵۵ از دوره جامع Python 🐍
ساخت سیستم تنظیمات برنامه با JSON
در پستهای قبل یاد گرفتیم چگونه اطلاعات را در فایل JSON ذخیره کنیم و خطاهای مربوط به آن را مدیریت کنیم.
حالا میخواهیم از این قابلیت برای ساخت یک سیستم تنظیمات واقعی برنامه استفاده کنیم.
بسیاری از برنامهها اطلاعاتی مثل:
زبان برنامه
حالت نمایش
تنظیمات کاربر
وضعیت فعال بودن قابلیتها
را در یک فایل تنظیمات ذخیره میکنند.
🔹 ساختار پروژه
ساختار پیشنهادی:
MyApp/
│
├── main.py
│
└── config/
└── settings.json
فایل:
settings.json
تنظیمات برنامه را نگهداری میکند.
🔹 ایجاد فایل تنظیمات پیشفرض
ابتدا یک تابع برای ساخت تنظیمات ایجاد میکنیم:
from pathlib import Path
import json
config_file = Path("config/settings.json")
def create_default_config():
config_file.parent.mkdir(
parents=True,
exist_ok=True
)
default_settings = {
"language": "fa",
"theme": "dark",
"notifications": True
}
with config_file.open(
"w",
encoding="utf-8"
) as file:
json.dump(
default_settings,
file,
indent=4,
ensure_ascii=False
)
اگر پوشه یا فایل وجود نداشته باشد، ساخته میشود.
🔹 خواندن تنظیمات
حالا یک تابع برای خواندن تنظیمات:
def load_config():
with config_file.open(
"r",
encoding="utf-8"
) as file:
return json.load(file)
استفاده:
settings = load_config()
print(settings["theme"])
خروجی:
dark
🔹 تغییر تنظیمات
فرض کنیم کاربر میخواهد حالت نمایش را تغییر دهد:
def update_theme(theme):
settings = load_config()
settings["theme"] = theme
with config_file.open(
"w",
encoding="utf-8"
) as file:
json.dump(
settings,
file,
indent=4,
ensure_ascii=False
)
استفاده:
update_theme("light")حالا فایل:
{
"language": "fa",
"theme": "light",
"notifications": true
}خواهد بود.
🔹 بررسی وجود فایل تنظیمات
در برنامه واقعی بهتر است قبل از خواندن بررسی کنیم فایل وجود دارد یا نه:
if not config_file.exists():
create_default_config()
settings = load_config()
یعنی:
اگر تنظیمات وجود ندارد → ایجاد کن.
اگر وجود دارد → بخوان.
🔥 مثال کامل
from pathlib import Path
import json
config_file = Path("config/settings.json")
def create_config():
config_file.parent.mkdir(
parents=True,
exist_ok=True
)
settings = {
"language": "fa",
"theme": "dark",
"notifications": True
}
with config_file.open(
"w",
encoding="utf-8"
) as file:
json.dump(
settings,
file,
indent=4,
ensure_ascii=False
)
def load_config():
with config_file.open(
"r",
encoding="utf-8"
) as file:
return json.load(file)
if not config_file.exists():
create_config()
config = load_config()
print(json.dumps(
config,
indent=4,
ensure_ascii=False
))
خروجی:
{
"language": "fa",
"theme": "dark",
"notifications": true
}⚠️ نکته مهم
فایل تنظیمات معمولاً اطلاعاتی مثل:
رمز عبور
کلید API
اطلاعات حساس
را نباید بدون رمزنگاری ذخیره کند.
JSON فقط یک روش ذخیرهسازی است و امنیت داخلی ندارد.
🧠 خلاصه
JSON
→ ذخیره تنظیمات برنامه
Path
→ مدیریت مسیر فایل
exists()
→ بررسی وجود فایل
dump()
→ ذخیره تنظیمات
load()
→ خواندن تنظیمات
🎯 تمرین
یک سیستم تنظیمات ساده بسازید:
قابلیتها:
اگر فایل:
config/app.json
وجود نداشت، آن را بسازد.
تنظیمات پیشفرض:
{
"username": "Guest",
"language": "fa",
"theme": "dark"
}را ذخیره کند.
تنظیمات را بخواند.
مقدار
username را چاپ کند.خروجی:
Guest
پست ۱۵۵ از دوره جامع Python 🐍
1
security_toolkit.py
5.9 KB
Security Toolkit 🔐
جعبهابزار پایتون برای کارهای پایهای امنیتی: تولید و بررسی قدرت رمز عبور، هش کردن (SHA-256)، و رمزنگاری/رمزگشایی متقارن (AES via Fernet).
قابلیتها
تولید رمز عبور تصادفی و امن (با
بررسی و امتیازدهی به قدرت یک رمز عبور
هش SHA-256 برای متن و فایل
رمزنگاری/رمزگشایی متن با کلید متقارن
نیازمندیها (Requirements)
Python 3.8 یا بالاتر
کتابخانه
نصب:
نحوه اجرا
استفاده در کد خودتان
نکات مهم برای انتشار
کلید تولیدشده (
این ابزار برای یادگیری و محافظت از سیستم/دادههای خودتان است، نه برای نفوذ به سیستم دیگران.
لایسنس پیشنهادی برای انتشار عمومی: MIT
جعبهابزار پایتون برای کارهای پایهای امنیتی: تولید و بررسی قدرت رمز عبور، هش کردن (SHA-256)، و رمزنگاری/رمزگشایی متقارن (AES via Fernet).
قابلیتها
تولید رمز عبور تصادفی و امن (با
secrets، نه random)بررسی و امتیازدهی به قدرت یک رمز عبور
هش SHA-256 برای متن و فایل
رمزنگاری/رمزگشایی متن با کلید متقارن
نیازمندیها (Requirements)
Python 3.8 یا بالاتر
کتابخانه
cryptographyنصب:
pip install cryptography
نحوه اجرا
python security_toolkit.py
استفاده در کد خودتان
from security_toolkit import SecurityToolkit
toolkit = SecurityToolkit()
password = toolkit.generate_password(length=16)
key = toolkit.generate_key()
token = toolkit.encrypt_text("پیام محرمانه", key)
نکات مهم برای انتشار
کلید تولیدشده (
generate_key) را هرگز داخل کد یا ریپازیتوری عمومی قرار ندهید؛ در متغیر محیطی (env) یا یک secret manager نگه دارید.این ابزار برای یادگیری و محافظت از سیستم/دادههای خودتان است، نه برای نفوذ به سیستم دیگران.
لایسنس پیشنهادی برای انتشار عمومی: MIT
🐍 آموزش جامع Python — پست ۱۵۶
بهروزرسانی JSON با اعتبارسنجی نوع و مقدار
در پست قبل یاد گرفتیم چگونه یک تنظیم خاص را در فایل JSON تغییر دهیم.
اما یک مشکل وجود دارد:
ممکن است کاربر مقدار نامعتبر وارد کند.
مثلاً:
در حالی که
باشد.
پس قبل از ذخیره، باید کلید، نوع و مقدار را بررسی کنیم.
🔹 تعریف قوانین تنظیمات
میتوانیم قوانین مجاز را مشخص کنیم:
یعنی:
🔹 اعتبارسنجی نوع
ابتدا نوع مقدار را بررسی میکنیم:
مثلاً:
مقدار
پس:
نمایش داده میشود.
🔹 اعتبارسنجی مقدار
اگر تنظیم دارای مقادیر مجاز باشد:
مثلاً:
چون
نمایش داده میشود.
🔥 مثال کامل
🔹 مثالهای معتبر
خروجی:
یا:
خروجی:
🔹 مثالهای نامعتبر
نوع اشتباه:
خروجی:
مقدار نامعتبر:
خروجی:
کلید نامعتبر:
خروجی:
🧠 خلاصه
قبل از تغییر تنظیمات، سه مرحله مهم داریم:
بعد از عبور از این سه مرحله:
این الگو در برنامههای واقعی برای جلوگیری از ورود دادههای نامعتبر بسیار کاربردی است.
🎯 تمرین
قانون جدید زیر را به
سپس این موارد را امتحان کن:
دو مورد اول باید موفق باشند و مورد سوم باید:
نمایش دهد.
پست ۱۵۶ از دوره جامع Python 🐍
بهروزرسانی JSON با اعتبارسنجی نوع و مقدار
در پست قبل یاد گرفتیم چگونه یک تنظیم خاص را در فایل JSON تغییر دهیم.
اما یک مشکل وجود دارد:
ممکن است کاربر مقدار نامعتبر وارد کند.
مثلاً:
update_setting("theme", 123)در حالی که
theme باید یک رشته مثل:dark
light
باشد.
پس قبل از ذخیره، باید کلید، نوع و مقدار را بررسی کنیم.
🔹 تعریف قوانین تنظیمات
میتوانیم قوانین مجاز را مشخص کنیم:
settings_rules = {
"username": {
"type": str
},
"language": {
"type": str,
"values": {"fa", "en"}
},
"theme": {
"type": str,
"values": {"dark", "light"}
}
}یعنی:
username → باید str باشد
language → باید str باشد و فقط fa یا en باشد
theme → باید str باشد و فقط dark یا light باشد
🔹 اعتبارسنجی نوع
ابتدا نوع مقدار را بررسی میکنیم:
if not isinstance(value, rule["type"]):
print("Invalid type")
return
مثلاً:
update_setting("theme", 123)مقدار
123 از نوع int است، در حالی که theme باید str باشد.پس:
Invalid type
نمایش داده میشود.
🔹 اعتبارسنجی مقدار
اگر تنظیم دارای مقادیر مجاز باشد:
if "values" in rule and value not in rule["values"]:
print("Invalid value")
return
مثلاً:
update_setting("theme", "blue")چون
blue در مقادیر مجاز نیست:Invalid value
نمایش داده میشود.
🔥 مثال کامل
from pathlib import Path
import json
file = Path("config/app.json")
settings_rules = {
"username": {
"type": str
},
"language": {
"type": str,
"values": {"fa", "en"}
},
"theme": {
"type": str,
"values": {"dark", "light"}
}
}
def update_setting(key, value):
# بررسی وجود کلید
if key not in settings_rules:
print("Invalid setting")
return
rule = settings_rules[key]
# بررسی نوع داده
if not isinstance(value, rule["type"]):
print("Invalid type")
return
# بررسی مقدار مجاز
if "values" in rule and value not in rule["values"]:
print("Invalid value")
return
# بررسی وجود فایل
if not file.exists():
print("Config file not found")
return
try:
# خواندن تنظیمات
with file.open("r", encoding="utf-8") as f:
settings = json.load(f)
# تغییر مقدار
settings[key] = value
# ذخیره دوباره
with file.open("w", encoding="utf-8") as f:
json.dump(
settings,
f,
indent=4,
ensure_ascii=False
)
print("Setting updated")
except json.JSONDecodeError:
print("Invalid JSON file")
except PermissionError:
print("Permission denied")
🔹 مثالهای معتبر
update_setting("theme", "light")خروجی:
Setting updated
یا:
update_setting("language", "en")خروجی:
Setting updated
🔹 مثالهای نامعتبر
نوع اشتباه:
update_setting("theme", 123)خروجی:
Invalid type
مقدار نامعتبر:
update_setting("theme", "blue")خروجی:
Invalid value
کلید نامعتبر:
update_setting("color", "red")خروجی:
Invalid setting
🧠 خلاصه
قبل از تغییر تنظیمات، سه مرحله مهم داریم:
کلید
↓
آیا تنظیم مجاز است؟
نوع
↓
آیا نوع داده درست است؟
مقدار
↓
آیا مقدار مجاز است؟
بعد از عبور از این سه مرحله:
JSON
↓
load()
↓
تغییر مقدار
↓
dump()
↓
JSON
این الگو در برنامههای واقعی برای جلوگیری از ورود دادههای نامعتبر بسیار کاربردی است.
🎯 تمرین
قانون جدید زیر را به
settings_rules اضافه کن:"notifications": {
"type": bool
}سپس این موارد را امتحان کن:
update_setting("notifications", True)
update_setting("notifications", False)
update_setting("notifications", "yes")دو مورد اول باید موفق باشند و مورد سوم باید:
Invalid type
نمایش دهد.
پست ۱۵۶ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۵۷
اعتبارسنجی ساختارهای تودرتو در JSON
در پست قبل یاد گرفتیم نوع و مقدار تنظیمات را بررسی کنیم.
اما دادههای JSON همیشه ساده نیستند؛ گاهی شامل لیست، دیکشنری و ساختارهای تودرتو هستند.
مثلاً:
اینجا
🔹 بررسی کلیدهای اجباری
گاهی بعضی کلیدها باید حتماً وجود داشته باشند.
مثلاً برای اطلاعات کاربر،
اگر هر دو کلید وجود داشته باشند، چیزی چاپ نمیشود.
اما اگر:
خروجی:
🔹 بررسی وجود کلید اصلی
برای ساختارهای تودرتو، ابتدا باید کلید اصلی را بررسی کنیم:
بعد نوع آن را بررسی میکنیم:
سپس میتوانیم کلیدهای اجباری داخل آن را بررسی کنیم.
🔹 ترکیب کلیدهای اجباری و نوع داده
خروجی:
🔹
در این قسمت:
بررسی میکنیم که تمام کلیدهای اجباری وجود داشته باشند.
مثلاً:
نتیجه:
اما اگر
⚠️ نکته مهم
بین این دو مفهوم تفاوت وجود دارد:
کلید وجود ندارد:
کلید وجود دارد اما مقدار آن اشتباه است:
ولی:
پس اعتبارسنجی بهتر است مرحلهبهمرحله انجام شود:
🔹 مثال با لیست کاربران
خروجی:
🧠 خلاصه
در اعتبارسنجی JSON میتوانیم بررسی کنیم:
کلیدهای اجباری برای جلوگیری از دادههای ناقص بسیار مهم هستند.
🎯 تمرین
داده زیر را اعتبارسنجی کن:
شرایط:
اگر همه درست بودند:
در غیر این صورت:
پست ۱۵۷ از دوره جامع Python 🐍
اعتبارسنجی ساختارهای تودرتو در JSON
در پست قبل یاد گرفتیم نوع و مقدار تنظیمات را بررسی کنیم.
اما دادههای JSON همیشه ساده نیستند؛ گاهی شامل لیست، دیکشنری و ساختارهای تودرتو هستند.
مثلاً:
settings = {
"user": {
"name": "Ali",
"age": 25
},
"theme": "dark"
}اینجا
user خودش یک دیکشنری است.🔹 بررسی کلیدهای اجباری
گاهی بعضی کلیدها باید حتماً وجود داشته باشند.
مثلاً برای اطلاعات کاربر،
name و age را اجباری در نظر میگیریم:user = {
"name": "Ali",
"age": 25
}
required_keys = ["name", "age"]
for key in required_keys:
if key not in user:
print(f"Missing key: {key}")اگر هر دو کلید وجود داشته باشند، چیزی چاپ نمیشود.
اما اگر:
user = {
"name": "Ali"
}خروجی:
Missing key: age
🔹 بررسی وجود کلید اصلی
برای ساختارهای تودرتو، ابتدا باید کلید اصلی را بررسی کنیم:
if "user" not in settings:
print("Missing user")
بعد نوع آن را بررسی میکنیم:
user = settings.get("user")
if not isinstance(user, dict):
print("Invalid user")سپس میتوانیم کلیدهای اجباری داخل آن را بررسی کنیم.
🔹 ترکیب کلیدهای اجباری و نوع داده
settings = {
"user": {
"name": "Ali",
"age": 25
}
}
user = settings.get("user")
required_keys = ["name", "age"]
if not isinstance(user, dict):
print("Invalid user")
elif not all(key in user for key in required_keys):
print("Missing required key")
elif not isinstance(user["name"], str):
print("Invalid name")
elif not isinstance(user["age"], int):
print("Invalid age")
else:
print("User data is valid")خروجی:
User data is valid
🔹
all() چه کاری انجام میدهد؟در این قسمت:
all(key in user for key in required_keys)
بررسی میکنیم که تمام کلیدهای اجباری وجود داشته باشند.
مثلاً:
required_keys = ["name", "age"]
user = {
"name": "Ali",
"age": 25
}
نتیجه:
True
اما اگر
age وجود نداشته باشد:False
⚠️ نکته مهم
بین این دو مفهوم تفاوت وجود دارد:
کلید وجود ندارد:
"user" not in data
کلید وجود دارد اما مقدار آن اشتباه است:
"user" in data
ولی:
not isinstance(data["user"], dict)
پس اعتبارسنجی بهتر است مرحلهبهمرحله انجام شود:
JSON
↓
کلید اصلی وجود دارد؟
↓
نوع مقدار درست است؟
↓
کلیدهای اجباری وجود دارند؟
↓
نوع مقادیر داخلی درست است؟
↓
مقادیر مجاز هستند؟
🔹 مثال با لیست کاربران
data = {
"users": [
{"name": "Ali", "age": 25},
{"name": "Sara", "age": 22}
]
}
users = data.get("users")
if isinstance(users, list):
for user in users:
if not isinstance(user, dict):
print("Invalid user")
continue
if not all(key in user for key in ["name", "age"]):
print("Missing required key")
continue
print(user["name"])خروجی:
Ali
Sara
🧠 خلاصه
در اعتبارسنجی JSON میتوانیم بررسی کنیم:
کلید اصلی وجود دارد؟
نوع داده درست است؟
کلیدهای اجباری وجود دارند؟
نوع مقادیر داخلی درست است؟
مقدار مجاز است؟
کلیدهای اجباری برای جلوگیری از دادههای ناقص بسیار مهم هستند.
🎯 تمرین
داده زیر را اعتبارسنجی کن:
data = {
"user": {
"name": "Ali",
"age": 25
}
}شرایط:
user → باید dict باشد
name → کلید اجباری و باید str باشد
age → کلید اجباری و باید int باشد
اگر همه درست بودند:
User data is valid
در غیر این صورت:
Invalid user data
پست ۱۵۷ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۵۸
اعتبارسنجی لیستها و تعداد اعضا در JSON
در پست قبل یاد گرفتیم چطور کلیدهای اجباری و نوع دادههای تودرتو را بررسی کنیم.
حالا یک مرحله جلوتر میرویم و یاد میگیریم چطور لیستها و تعداد اعضای آنها را اعتبارسنجی کنیم.
🔹 بررسی اینکه مقدار یک لیست است
فرض کنیم JSON ما شامل لیستی از کاربران است:
ابتدا نوع
🔹 بررسی خالی نبودن لیست
گاهی وجود لیست کافی نیست و باید حداقل یک عضو داشته باشد:
یا به شکل کوتاهتر:
اما روش اول واضحتر است، چون مشخص میکند دقیقاً چه چیزی را بررسی میکنیم.
🔹 تعیین حداقل تعداد اعضا
مثلاً میخواهیم حداقل ۲ کاربر وجود داشته باشد:
اگر فقط یک کاربر داشته باشیم:
خروجی:
🔹 تعیین حداکثر تعداد اعضا
گاهی تعداد اعضا نباید بیشتر از یک مقدار مشخص باشد:
پس میتوانیم یک محدوده تعیین کنیم:
یعنی:
🔹 اعتبارسنجی اعضای لیست
فقط تعداد اعضا کافی نیست.
هر عضو هم باید ساختار درستی داشته باشد:
اینجا برای هر کاربر بررسی میکنیم:
🔥 ترکیب همه بررسیها
خروجی:
⚠️ نکته مهم
در اعتبارسنجی یک لیست، معمولاً چند مرحله داریم:
این الگو در کار با JSONهای واقعی بسیار کاربردی است.
🧠 خلاصه
بررسی نوع لیست.
تعداد اعضای لیست.
تعیین محدوده مجاز.
و با
🎯 تمرین
داده زیر را اعتبارسنجی کن:
قوانین:
اگر همه موارد درست بودند:
در غیر این صورت:
پست ۱۵۸ از دوره جامع Python 🐍
اعتبارسنجی لیستها و تعداد اعضا در JSON
در پست قبل یاد گرفتیم چطور کلیدهای اجباری و نوع دادههای تودرتو را بررسی کنیم.
حالا یک مرحله جلوتر میرویم و یاد میگیریم چطور لیستها و تعداد اعضای آنها را اعتبارسنجی کنیم.
🔹 بررسی اینکه مقدار یک لیست است
فرض کنیم JSON ما شامل لیستی از کاربران است:
data = {
"users": [
{"name": "Ali", "age": 25},
{"name": "Sara", "age": 22}
]
}ابتدا نوع
users را بررسی میکنیم:users = data.get("users")
if isinstance(users, list):
print("Users is valid")
else:
print("Invalid users")🔹 بررسی خالی نبودن لیست
گاهی وجود لیست کافی نیست و باید حداقل یک عضو داشته باشد:
if isinstance(users, list) and len(users) > 0:
print("Users list is not empty")
یا به شکل کوتاهتر:
if users:
print("Users list is not empty")
اما روش اول واضحتر است، چون مشخص میکند دقیقاً چه چیزی را بررسی میکنیم.
🔹 تعیین حداقل تعداد اعضا
مثلاً میخواهیم حداقل ۲ کاربر وجود داشته باشد:
if isinstance(users, list) and len(users) >= 2:
print("Valid users")
else:
print("Not enough users")
اگر فقط یک کاربر داشته باشیم:
users = [
{"name": "Ali", "age": 25}
]
خروجی:
Not enough users
🔹 تعیین حداکثر تعداد اعضا
گاهی تعداد اعضا نباید بیشتر از یک مقدار مشخص باشد:
if isinstance(users, list) and len(users) <= 100:
print("Users count is valid")
else:
print("Too many users")
پس میتوانیم یک محدوده تعیین کنیم:
if isinstance(users, list) and 1 <= len(users) <= 100:
print("Valid users")
یعنی:
حداقل ۱ عضو
حداکثر ۱۰۰ عضو
🔹 اعتبارسنجی اعضای لیست
فقط تعداد اعضا کافی نیست.
هر عضو هم باید ساختار درستی داشته باشد:
for user in users:
if not isinstance(user, dict):
print("Invalid user")
continue
if "name" not in user or "age" not in user:
print("Missing required key")
continue
print("Valid user")
اینجا برای هر کاربر بررسی میکنیم:
آیا dict است؟
آیا name دارد؟
آیا age دارد؟
🔥 ترکیب همه بررسیها
data = {
"users": [
{"name": "Ali", "age": 25},
{"name": "Sara", "age": 22}
]
}
users = data.get("users")
if not isinstance(users, list):
print("Invalid users")
elif not 1 <= len(users) <= 100:
print("Invalid users count")
else:
valid = True
for user in users:
if not isinstance(user, dict):
valid = False
break
if not all(key in user for key in ["name", "age"]):
valid = False
break
if not isinstance(user["name"], str):
valid = False
break
if not isinstance(user["age"], int):
valid = False
break
if valid:
print("Users data is valid")
else:
print("Invalid user data")خروجی:
Users data is valid
⚠️ نکته مهم
در اعتبارسنجی یک لیست، معمولاً چند مرحله داریم:
لیست وجود دارد؟
↓
نوع آن list است؟
↓
تعداد اعضا مجاز است؟
↓
هر عضو ساختار درستی دارد؟
↓
کلیدهای اجباری وجود دارند؟
↓
نوع مقادیر درست است؟
این الگو در کار با JSONهای واقعی بسیار کاربردی است.
🧠 خلاصه
isinstance(users, list)
بررسی نوع لیست.
len(users)
تعداد اعضای لیست.
1 <= len(users) <= 100
تعیین محدوده مجاز.
و با
for میتوانیم تکتک اعضای لیست را اعتبارسنجی کنیم.🎯 تمرین
داده زیر را اعتبارسنجی کن:
data = {
"products": [
{"name": "Laptop", "price": 1200},
{"name": "Mouse", "price": 25}
]
}قوانین:
products → باید list باشد
تعداد محصولات → بین 1 تا 50
هر محصول → باید dict باشد
name و price → کلیدهای اجباری
name → باید str باشد
price → باید int یا float باشد
اگر همه موارد درست بودند:
Products are valid
در غیر این صورت:
Invalid products
پست ۱۵۸ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۵۹
اعتبارسنجی مقدارهای عددی در JSON
در پست قبل ساختار لیستها و تعداد اعضای آنها را بررسی کردیم.
حالا میخواهیم علاوه بر نوع داده، خودِ محدوده و مقدار عددی را هم اعتبارسنجی کنیم.
🔹 بررسی حداقل و حداکثر مقدار
فرض کنیم اطلاعات یک محصول را داریم:
میتوانیم مشخص کنیم قیمت باید بین
خروجی:
🔹 اعتبارسنجی تعداد موجودی
مثلاً موجودی نباید منفی باشد:
پس:
🔹 چرا ابتدا نوع را بررسی میکنیم؟
این روش مناسب نیست:
چون اگر مقدار
مقایسه با عدد میتواند باعث خطا شود.
بهتر است ابتدا نوع را بررسی کنیم:
به دلیل Short-Circuit، اگر
🔹 تعیین محدوده برای چند مقدار
خروجی:
⚠️ یک نکته مهم درباره
در Python:
نتیجه:
چون
بنابراین اگر میخواهیم مقدار واقعاً عددی باشد و
🔹 اعتبارسنجی مقدارهای اعشاری
مثلاً درصد تخفیف:
مقدارهای:
🧠 الگوی کلی
برای یک مقدار عددی معمولاً این ترتیب را داریم:
مثلاً:
و سپس:
🎯 تمرین
داده زیر را اعتبارسنجی کن:
قوانین:
اگر همه معتبر بودند:
در غیر این صورت:
پست ۱۵۹ از دوره جامع Python 🐍
اعتبارسنجی مقدارهای عددی در JSON
در پست قبل ساختار لیستها و تعداد اعضای آنها را بررسی کردیم.
حالا میخواهیم علاوه بر نوع داده، خودِ محدوده و مقدار عددی را هم اعتبارسنجی کنیم.
🔹 بررسی حداقل و حداکثر مقدار
فرض کنیم اطلاعات یک محصول را داریم:
product = {
"name": "Laptop",
"price": 1200,
"stock": 15
}میتوانیم مشخص کنیم قیمت باید بین
1 تا 10000 باشد:price = product.get("price")
if isinstance(price, (int, float)) and 1 <= price <= 10000:
print("Valid price")
else:
print("Invalid price")خروجی:
Valid price
🔹 اعتبارسنجی تعداد موجودی
مثلاً موجودی نباید منفی باشد:
stock = product.get("stock")
if isinstance(stock, int) and stock >= 0:
print("Valid stock")
else:
print("Invalid stock")پس:
stock = 15 → معتبر
stock = 0 → معتبر
stock = -5 → نامعتبر
🔹 چرا ابتدا نوع را بررسی میکنیم؟
این روش مناسب نیست:
if product["price"] > 0:
print("Valid")
چون اگر مقدار
price رشته باشد:price = "1200"
مقایسه با عدد میتواند باعث خطا شود.
بهتر است ابتدا نوع را بررسی کنیم:
price = product.get("price")
if isinstance(price, (int, float)) and price > 0:
print("Valid")به دلیل Short-Circuit، اگر
isinstance() برابر False باشد، بخش دوم بررسی نمیشود.🔹 تعیین محدوده برای چند مقدار
product = {
"name": "Laptop",
"price": 1200,
"stock": 15,
"discount": 20
}
price = product.get("price")
stock = product.get("stock")
discount = product.get("discount")
if not isinstance(price, (int, float)) or not 1 <= price <= 10000:
print("Invalid price")
elif not isinstance(stock, int) or not 0 <= stock <= 1000:
print("Invalid stock")
elif not isinstance(discount, (int, float)) or not 0 <= discount <= 100:
print("Invalid discount")
else:
print("Product data is valid")خروجی:
Product data is valid
⚠️ یک نکته مهم درباره
boolدر Python:
isinstance(True, int)
نتیجه:
True
چون
bool زیرکلاسی از int است.بنابراین اگر میخواهیم مقدار واقعاً عددی باشد و
True یا False پذیرفته نشود، بهتر است بررسی دقیقتری انجام دهیم:if isinstance(price, (int, float)) and not isinstance(price, bool):
print("Numeric")
🔹 اعتبارسنجی مقدارهای اعشاری
مثلاً درصد تخفیف:
discount = 25.5
if (
isinstance(discount, (int, float))
and not isinstance(discount, bool)
and 0 <= discount <= 100
):
print("Valid discount")
مقدارهای:
0 → معتبر
25.5 → معتبر
100 → معتبر
-5 → نامعتبر
120 → نامعتبر
🧠 الگوی کلی
برای یک مقدار عددی معمولاً این ترتیب را داریم:
نوع داده
↓
عدد بودن واقعی
↓
حداقل مقدار
↓
حداکثر مقدار
مثلاً:
isinstance(value, (int, float))
و سپس:
min_value <= value <= max_value
🎯 تمرین
داده زیر را اعتبارسنجی کن:
product = {
"name": "Phone",
"price": 850,
"stock": 20,
"discount": 15
}قوانین:
name → باید str باشد
price → عدد بین 1 تا 10000
stock → عدد صحیح بین 0 تا 1000
discount → عدد بین 0 تا 100
اگر همه معتبر بودند:
Product is valid
در غیر این صورت:
Invalid product
پست ۱۵۹ از دوره جامع Python 🐍
1
🐍 آموزش جامع Python — پست ۱۶۰
اعتبارسنجی رشتهها در JSON
در پست قبل مقدارهای عددی مثل
حالا نوبت رشتهها (
در دادههای واقعی معمولاً لازم است بررسی کنیم:
مقدار واقعاً رشته باشد.
خالی نباشد.
طول آن در محدوده مشخص باشد.
فقط شامل مقدارهای مجاز باشد.
🔹 بررسی نوع رشته
🔹 جلوگیری از رشته خالی
این مقدار:
رشته است، اما ممکن است برای برنامه ما معتبر نباشد.
بنابراین:
🔹 بررسی طول رشته
مثلاً نام کاربر باید بین ۳ تا ۳۰ کاراکتر باشد:
🔹 محدود کردن مقدار به گزینههای مشخص
گاهی رشته باید فقط یکی از چند مقدار مشخص باشد.
مثلاً زبان برنامه:
خروجی:
اگر:
باشد:
🔥 ترکیب چند قانون
فرض کنیم اطلاعات محصول را داریم:
میخواهیم:
خروجی:
⚠️ نکته مهم
در اعتبارسنجی رشتهها،
مثلاً:
این مقدار:
را
پس باید قوانین مربوط به خود مقدار را هم بررسی کنیم:
🧠 خلاصه
بررسی نوع.
بررسی اینکه رشته فقط شامل فاصله نباشد.
بررسی طول.
بررسی مقدارهای مجاز.
🎯 تمرین
داده زیر را اعتبارسنجی کن:
قوانین:
اگر همه موارد معتبر بودند:
در غیر این صورت:
پست ۱۶۰ از دوره جامع Python 🐍
اعتبارسنجی رشتهها در JSON
در پست قبل مقدارهای عددی مثل
price، stock و discount را اعتبارسنجی کردیم.حالا نوبت رشتهها (
str) است.در دادههای واقعی معمولاً لازم است بررسی کنیم:
مقدار واقعاً رشته باشد.
خالی نباشد.
طول آن در محدوده مشخص باشد.
فقط شامل مقدارهای مجاز باشد.
🔹 بررسی نوع رشته
name = "Laptop"
if isinstance(name, str):
print("Valid name")
else:
print("Invalid name")
🔹 جلوگیری از رشته خالی
این مقدار:
name = ""
رشته است، اما ممکن است برای برنامه ما معتبر نباشد.
if isinstance(name, str) and name.strip():
print("Valid name")
else:
print("Invalid name")
strip() فاصلههای ابتدا و انتهای متن را حذف میکند.بنابراین:
"Ali" → معتبر
" Ali " → معتبر
"" → نامعتبر
" " → نامعتبر
🔹 بررسی طول رشته
مثلاً نام کاربر باید بین ۳ تا ۳۰ کاراکتر باشد:
username = "Ali"
if (
isinstance(username, str)
and 3 <= len(username.strip()) <= 30
):
print("Valid username")
else:
print("Invalid username")
🔹 محدود کردن مقدار به گزینههای مشخص
گاهی رشته باید فقط یکی از چند مقدار مشخص باشد.
مثلاً زبان برنامه:
language = "fa"
allowed_languages = {"fa", "en", "ar"}
if language in allowed_languages:
print("Valid language")
else:
print("Invalid language")
خروجی:
Valid language
اگر:
language = "de"
باشد:
Invalid language
🔥 ترکیب چند قانون
فرض کنیم اطلاعات محصول را داریم:
product = {
"name": "Laptop",
"category": "electronics"
}میخواهیم:
name → رشته و غیرخالی
category → یکی از گزینههای مجاز
name = product.get("name")
category = product.get("category")
allowed_categories = {
"electronics",
"clothing",
"books"
}
if not isinstance(name, str) or not name.strip():
print("Invalid name")
elif category not in allowed_categories:
print("Invalid category")
else:
print("Product strings are valid")خروجی:
Product strings are valid
⚠️ نکته مهم
در اعتبارسنجی رشتهها،
isinstance() بهتنهایی کافی نیست.مثلاً:
value = ""
این مقدار:
isinstance(value, str)
را
True میکند، اما ممکن است از نظر برنامه نامعتبر باشد.پس باید قوانین مربوط به خود مقدار را هم بررسی کنیم:
نوع
↓
خالی نبودن
↓
طول
↓
مقدارهای مجاز
🧠 خلاصه
isinstance(value, str)
بررسی نوع.
value.strip()
بررسی اینکه رشته فقط شامل فاصله نباشد.
len(value)
بررسی طول.
value in allowed_values
بررسی مقدارهای مجاز.
🎯 تمرین
داده زیر را اعتبارسنجی کن:
user = {
"username": "Ali",
"language": "fa",
"theme": "dark"
}قوانین:
username → باید str و غیرخالی باشد
username → طول بین 3 تا 20 کاراکتر
language → فقط "fa" یا "en"
theme → فقط "dark" یا "light"
اگر همه موارد معتبر بودند:
User is valid
در غیر این صورت:
Invalid user
پست ۱۶۰ از دوره جامع Python 🐍
1
🐍 آموزش جامع Python — پست ۱۶۱
اعتبارسنجی Boolean و مقادیر
در پستهای قبل یاد گرفتیم مقدارهای عددی و رشتهای را اعتبارسنجی کنیم.
حالا میخواهیم مقدارهای Boolean را بررسی کنیم؛ مثل:
در JSON هم Boolean فقط با این دو مقدار نمایش داده میشود:
🔹 بررسی نوع Boolean
برای اینکه مطمئن شویم مقدار واقعاً
خروجی:
🔹 چرا
این کار برای اعتبارسنجی مناسب نیست:
خروجی:
چون
اما مقدار ما باید واقعاً Boolean باشد.
بنابراین:
روش مناسبتری است.
🔹 مثال در تنظیمات برنامه
فرض کنیم:
میتوانیم هر دو مقدار را بررسی کنیم:
خروجی:
⚠️
در Python:
نتیجه:
و:
هم:
بنابراین اگر قانون ما این باشد که مقدار باید واقعاً Boolean باشد:
خروجی:
🔹 اعتبارسنجی چند تنظیم
در این مثال هم وجود کلید و هم نوع مقدار بررسی میشود.
🧠 الگوی اعتبارسنجی Boolean
برای یک مقدار Boolean:
برخلاف رشته یا عدد، برای Boolean معمولاً محدوده یا طول نداریم؛ مهم این است که مقدار واقعاً از نوع
🎯 تمرین
داده زیر را اعتبارسنجی کن:
قوانین:
اگر همه معتبر بودند:
در غیر این صورت:
پست ۱۶۱ از دوره جامع Python 🐍
اعتبارسنجی Boolean و مقادیر
True و False در JSONدر پستهای قبل یاد گرفتیم مقدارهای عددی و رشتهای را اعتبارسنجی کنیم.
حالا میخواهیم مقدارهای Boolean را بررسی کنیم؛ مثل:
True
False
در JSON هم Boolean فقط با این دو مقدار نمایش داده میشود:
true
false
🔹 بررسی نوع Boolean
برای اینکه مطمئن شویم مقدار واقعاً
bool است:notifications = True
if isinstance(notifications, bool):
print("Valid")
else:
print("Invalid")
خروجی:
Valid
🔹 چرا
bool() کافی نیست؟این کار برای اعتبارسنجی مناسب نیست:
value = "yes"
if bool(value):
print("Valid")
خروجی:
Valid
چون
"yes" یک رشته غیرخالی و Truthy است.اما مقدار ما باید واقعاً Boolean باشد.
بنابراین:
isinstance(value, bool)
روش مناسبتری است.
🔹 مثال در تنظیمات برنامه
فرض کنیم:
settings = {
"notifications": True,
"dark_mode": False
}میتوانیم هر دو مقدار را بررسی کنیم:
notifications = settings.get("notifications")
dark_mode = settings.get("dark_mode")
if not isinstance(notifications, bool):
print("Invalid notifications")
elif not isinstance(dark_mode, bool):
print("Invalid dark_mode")
else:
print("Settings are valid")خروجی:
Settings are valid
⚠️
0 و 1 را با Boolean اشتباه نگیریمدر Python:
isinstance(1, bool)
نتیجه:
False
و:
isinstance(0, bool)
هم:
False
بنابراین اگر قانون ما این باشد که مقدار باید واقعاً Boolean باشد:
value = 1
if isinstance(value, bool):
print("Valid")
else:
print("Invalid")
خروجی:
Invalid
🔹 اعتبارسنجی چند تنظیم
settings = {
"notifications": True,
"dark_mode": False,
"auto_save": True
}
required_keys = [
"notifications",
"dark_mode",
"auto_save"
]
valid = True
for key in required_keys:
if key not in settings:
valid = False
break
if not isinstance(settings[key], bool):
valid = False
break
if valid:
print("Settings are valid")
else:
print("Invalid settings")در این مثال هم وجود کلید و هم نوع مقدار بررسی میشود.
🧠 الگوی اعتبارسنجی Boolean
برای یک مقدار Boolean:
کلید وجود دارد؟
↓
مقدار bool است؟
↓
True یا False
برخلاف رشته یا عدد، برای Boolean معمولاً محدوده یا طول نداریم؛ مهم این است که مقدار واقعاً از نوع
bool باشد.🎯 تمرین
داده زیر را اعتبارسنجی کن:
settings = {
"notifications": True,
"dark_mode": False,
"auto_update": True
}قوانین:
notifications → کلید اجباری و bool
dark_mode → کلید اجباری و bool
auto_update → کلید اجباری و bool
اگر همه معتبر بودند:
Settings are valid
در غیر این صورت:
Invalid settings
پست ۱۶۱ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۶۲
اعتبارسنجی
در پست قبل مقدارهای
حالا میخواهیم با یک حالت مهم دیگر آشنا شویم:
در JSON، مقدار معادل
🔹
مثلاً:
خروجی:
برای بررسی آن بهتر است از
🔹 تفاوت
این دو مقدار یکسان نیستند:
مثلاً:
خروجی:
🔹 مقدار اختیاری
گاهی یک فیلد اجباری نیست.
مثلاً:
در اینجا
میتوانیم این حالت را بررسی کنیم:
🔹
فرض کنیم
پس دو حالت معتبر داریم:
⚠️ تفاوت
این دو حالت را دقت کن:
اگر بنویسیم:
نتیجه:
اما نمیدانیم آیا:
کلید
یا کلید وجود دارد و مقدارش واقعاً
برای تشخیص این دو حالت:
این تفاوت در اعتبارسنجی JSON مهم است.
🔥 مثال کامل
در این مثال:
🧠 خلاصه
برای بررسی
و:
همچنین باید تفاوت این سه حالت را بدانیم:
🎯 تمرین
داده زیر را اعتبارسنجی کن:
قوانین:
اگر معتبر بود:
در غیر این صورت:
پست ۱۶۲ از دوره جامع Python 🐍
اعتبارسنجی
None و مقدارهای اختیاری در JSONدر پست قبل مقدارهای
True و False را اعتبارسنجی کردیم.حالا میخواهیم با یک حالت مهم دیگر آشنا شویم:
None
در JSON، مقدار معادل
None با null نمایش داده میشود:null
🔹
None چیست؟None یعنی در Python مقداری وجود ندارد.مثلاً:
email = None
print(email)
خروجی:
None
برای بررسی آن بهتر است از
is استفاده کنیم:if email is None:
print("Email is not set")
🔹 تفاوت
None با رشته خالیاین دو مقدار یکسان نیستند:
email1 = None
email2 = ""
None یعنی مقدار وجود ندارد، اما "" یک رشته خالی است.مثلاً:
print(email1 is None)
print(email2 is None)
خروجی:
True
False
🔹 مقدار اختیاری
گاهی یک فیلد اجباری نیست.
مثلاً:
user = {
"username": "Ali",
"email": None
}در اینجا
username اجباری است، اما email میتواند None باشد.میتوانیم این حالت را بررسی کنیم:
email = user.get("email")
if email is None:
print("Email is optional")
elif isinstance(email, str):
print("Valid email")
else:
print("Invalid email")🔹
None یا مقدار معتبر؟فرض کنیم
age اختیاری است، اما اگر مقدار داشته باشد باید int باشد:age = user.get("age")
if age is None:
print("Age is not provided")
elif isinstance(age, int) and not isinstance(age, bool):
print("Valid age")
else:
print("Invalid age")پس دو حالت معتبر داریم:
None → معتبر، چون اختیاری است
25 → معتبر
"25" → نامعتبر
True → نامعتبر
⚠️ تفاوت
get() با بررسی کلیداین دو حالت را دقت کن:
user = {
"username": "Ali"
}اگر بنویسیم:
print(user.get("email"))نتیجه:
None
اما نمیدانیم آیا:
کلید
email وجود ندارد؟یا کلید وجود دارد و مقدارش واقعاً
None است؟برای تشخیص این دو حالت:
if "email" not in user:
print("Email key is missing")
elif user["email"] is None:
print("Email is explicitly None")
این تفاوت در اعتبارسنجی JSON مهم است.
🔥 مثال کامل
user = {
"username": "Ali",
"email": None,
"age": 25
}
if "username" not in user:
print("Missing username")
elif not isinstance(user["username"], str):
print("Invalid username")
elif "email" in user and user["email"] is not None:
if not isinstance(user["email"], str):
print("Invalid email")
else:
print("User is valid")
else:
print("User is valid")در این مثال:
username → اجباری
email → اختیاری
age → میتواند بررسی جداگانه داشته باشد
🧠 خلاصه
Python JSON
None → null
True → true
False → false
برای بررسی
None:value is None
و:
value is not None
همچنین باید تفاوت این سه حالت را بدانیم:
کلید وجود ندارد
کلید وجود دارد و مقدار None است
کلید وجود دارد و مقدار واقعی دارد
🎯 تمرین
داده زیر را اعتبارسنجی کن:
user = {
"username": "Ali",
"phone": None
}قوانین:
username → اجباری و باید str باشد
phone → اختیاری
phone → اگر None بود، معتبر است
phone → اگر مقدار داشت، باید str باشد
اگر معتبر بود:
User is valid
در غیر این صورت:
Invalid user
پست ۱۶۲ از دوره جامع Python 🐍