🐍 آموزش جامع Python — پست ۱۳۸
مدیریت همزمان
تا اینجا یاد گرفتیم:
و برای تغییر مسیر آنها از:
استفاده کردیم.
حالا میتوانیم هر دو را همزمان به مقصدهای مختلف هدایت کنیم.
🔹 هدایت به دو فایل مختلف
بعد از اجرای برنامه:
و
🔹 چرا از چند Context Manager استفاده کردیم؟
در Python میتوان چند Context Manager را در یک
بنابراین:
یعنی هر دو Context Manager در یک بلوک فعال هستند.
🔥 مثال کاربردی
فرض کنید یک برنامه گزارش اجرا تولید میکند:
میتوانیم خروجی عادی و خطاها را جداگانه ذخیره کنیم:
نتیجه:
و:
⚠️ نکته مهم
ترتیب Context Managerها در
مثلاً:
ورود به Contextها به ترتیب نوشتهشدن انجام میشود و هنگام خروج، برعکس خارج میشوند.
یعنی:
این همان رفتار LIFO است که در
🧠 خلاصه
یعنی چند Context Manager را میتوان همزمان مدیریت کرد.
در این مثال:
خروجی عادی و پیامهای خطا در دو مسیر جدا قرار میگیرند.
🎯 تمرین
کد را کامل کن:
هدف:
و:
پست ۱۳۸ از دوره جامع Python 🐍
مدیریت همزمان
stdout و stderrتا اینجا یاد گرفتیم:
stdout → خروجی عادی
stderr → پیامهای خطا
و برای تغییر مسیر آنها از:
redirect_stdout()
redirect_stderr()
استفاده کردیم.
حالا میتوانیم هر دو را همزمان به مقصدهای مختلف هدایت کنیم.
🔹 هدایت به دو فایل مختلف
import sys
from contextlib import redirect_stdout, redirect_stderr
with open("output.txt", "w") as output:
with open("errors.txt", "w") as errors:
with redirect_stdout(output), redirect_stderr(errors):
print("Program started")
print("Something went wrong", file=sys.stderr)
بعد از اجرای برنامه:
output.txt:Program started
و
errors.txt:Something went wrong
🔹 چرا از چند Context Manager استفاده کردیم؟
در Python میتوان چند Context Manager را در یک
with قرار داد:with context1, context2:
...
بنابراین:
with redirect_stdout(output), redirect_stderr(errors):
یعنی هر دو Context Manager در یک بلوک فعال هستند.
🔥 مثال کاربردی
فرض کنید یک برنامه گزارش اجرا تولید میکند:
import sys
def run():
print("Starting...")
print("Loading data...")
print("Invalid record", file=sys.stderr)
print("Finished")
میتوانیم خروجی عادی و خطاها را جداگانه ذخیره کنیم:
from contextlib import redirect_stdout, redirect_stderr
with open("output.txt", "w") as output:
with open("errors.txt", "w") as errors:
with redirect_stdout(output), redirect_stderr(errors):
run()
نتیجه:
output.txt
----------------
Starting...
Loading data...
Finished
و:
errors.txt
----------------
Invalid record
⚠️ نکته مهم
ترتیب Context Managerها در
with اهمیت دارد.مثلاً:
with context1, context2:
...
ورود به Contextها به ترتیب نوشتهشدن انجام میشود و هنگام خروج، برعکس خارج میشوند.
یعنی:
ورود:
context1
↓
context2
خروج:
context2
↓
context1
این همان رفتار LIFO است که در
ExitStack هم دیدیم.🧠 خلاصه
with context1, context2:
...
یعنی چند Context Manager را میتوان همزمان مدیریت کرد.
در این مثال:
with redirect_stdout(output), redirect_stderr(errors):
خروجی عادی و پیامهای خطا در دو مسیر جدا قرار میگیرند.
🎯 تمرین
کد را کامل کن:
import sys
from contextlib import redirect_stdout, redirect_stderr
def program():
print("Start")
print("Warning", file=sys.stderr)
print("Done")
with open("output.txt", "w") as output:
with open("errors.txt", "w") as errors:
# هر دو مسیر را به فایل مناسب هدایت کن
...
هدف:
output.txt
Start
Done
و:
errors.txt
Warning
پست ۱۳۸ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۳۹
تغییر موقت ورودی استاندارد با
در پست قبل با
برای ورودی استاندارد نیز چیزی به نام
اگر بخواهیم موقتاً ورودی
🔹
بهصورت معمول، وقتی مینویسیم:
ورودی از
میتوانیم
🔹 تغییر
برای اینکه این تغییر فقط داخل
حالا میتوانیم از آن استفاده کنیم:
اگر
باشد، خروجی:
خواهد بود.
🔹 چند ورودی از فایل
فرض کنید فایل
باشد.
میتوانیم بنویسیم:
خروجی:
🔥 کاربرد مهم: تست برنامه
این روش برای برنامههایی که با
مثلاً:
فایل:
و اجرای برنامه:
خروجی:
بدون اینکه کاربر
⚠️ محدودیت مهم
این روش ورودی تعاملی واقعی را شبیهسازی نمیکند.
وقتی:
باشد،
بنابراین برای برنامههایی که نیاز به تعامل مداوم با کاربر دارند، مناسب نیست.
مثلاً اگر فایل فقط دو خط داشته باشد و برنامه سه بار
در بار سوم دیگر ورودی کافی وجود ندارد و ممکن است
⚠️ یک نکته دیگر
تغییر
به همین دلیل در Context Manager بالا، مقدار قبلی ذخیره میشود:
و در
حتی اگر داخل
🧠 خلاصه
برای تغییر موقت
و در پایان:
را انجام دهیم.
نکته: برخلاف
🎯 تمرین
فایل
سپس Context Manager را کامل کن تا برنامه زیر ورودیهایش را از فایل دریافت کند:
خروجی باید باشد:
پست ۱۳۹ از دوره جامع Python 🐍
تغییر موقت ورودی استاندارد با
sys.stdinدر پست قبل با
stdout و stderr آشنا شدیم.برای ورودی استاندارد نیز چیزی به نام
redirect_stdin() در contextlib وجود ندارد.اگر بخواهیم موقتاً ورودی
input() را از یک فایل یا منبع دیگر دریافت کنیم، میتوانیم sys.stdin را تغییر دهیم.🔹
sys.stdin چیست؟sys.stdin همان ورودی استاندارد برنامه است.بهصورت معمول، وقتی مینویسیم:
name = input("Name: ")ورودی از
sys.stdin خوانده میشود.میتوانیم
sys.stdin را موقتاً به یک فایل وصل کنیم.🔹 تغییر
stdinبرای اینکه این تغییر فقط داخل
with انجام شود، میتوانیم یک Context Manager ساده بسازیم:import sys
from contextlib import contextmanager
@contextmanager
def redirect_stdin(file):
old_stdin = sys.stdin
sys.stdin = file
try:
yield
finally:
sys.stdin = old_stdin
حالا میتوانیم از آن استفاده کنیم:
with open("input.txt", "r") as file:
with redirect_stdin(file):
name = input()
print(name)اگر
input.txt شامل:Ali
باشد، خروجی:
Ali
خواهد بود.
🔹 چند ورودی از فایل
فرض کنید فایل
input.txt شامل:Ali
25
باشد.
میتوانیم بنویسیم:
with open("input.txt", "r") as file:
with redirect_stdin(file):
name = input()
age = input()
print(name)
print(age)خروجی:
Ali
25
🔥 کاربرد مهم: تست برنامه
این روش برای برنامههایی که با
input() کار میکنند، در تستهای ساده مفید است.مثلاً:
def calculate():
a = int(input())
b = int(input())
print(a + b)
فایل:
10
20
و اجرای برنامه:
with open("input.txt", "r") as file:
with redirect_stdin(file):
calculate()خروجی:
30
بدون اینکه کاربر
10 و 20 را دستی وارد کند.⚠️ محدودیت مهم
این روش ورودی تعاملی واقعی را شبیهسازی نمیکند.
وقتی:
sys.stdin = file
باشد،
input() از فایل میخواند، نه از کیبورد.بنابراین برای برنامههایی که نیاز به تعامل مداوم با کاربر دارند، مناسب نیست.
مثلاً اگر فایل فقط دو خط داشته باشد و برنامه سه بار
input() اجرا کند:a = input()
b = input()
c = input()
در بار سوم دیگر ورودی کافی وجود ندارد و ممکن است
EOFError رخ دهد.⚠️ یک نکته دیگر
تغییر
stdin فقط باید موقت باشد.به همین دلیل در Context Manager بالا، مقدار قبلی ذخیره میشود:
old_stdin = sys.stdin
و در
finally دوباره برگردانده میشود:sys.stdin = old_stdin
حتی اگر داخل
with خطایی رخ دهد، stdin به حالت قبلی برمیگردد.🧠 خلاصه
sys.stdin → ورودی استاندارد
sys.stdout → خروجی استاندارد
sys.stderr → خروجی خطا
برای تغییر موقت
stdin میتوانیم:old_stdin = sys.stdin
sys.stdin = file
و در پایان:
sys.stdin = old_stdin
را انجام دهیم.
نکته: برخلاف
redirect_stdout() و redirect_stderr()، در contextlib تابع آمادهای به نام redirect_stdin() نداریم و باید چنین Context Managerای را خودمان بسازیم یا از ابزارهای مناسب تست استفاده کنیم.🎯 تمرین
فایل
input.txt را با این محتوا بساز:10
20
سپس Context Manager را کامل کن تا برنامه زیر ورودیهایش را از فایل دریافت کند:
def calculate():
a = int(input())
b = int(input())
print(a + b)
خروجی باید باشد:
30
پست ۱۳۹ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۴۰
تغییر موقت پوشه کاری با
گاهی برنامه لازم دارد برای مدت کوتاهی در یک پوشه خاص کار کند و بعد از اتمام عملیات، به پوشه قبلی برگردد.
در Python میتوانیم از
🔹 استفاده ساده
اگر پوشه
یعنی:
🔹 چرا
فرض کنید:
میتوانیم موقتاً وارد
داخل
🔹 بازگشت خودکار
اگر خطایی هم رخ دهد، مسیر قبلی بازگردانده میشود:
بعد از خروج از
⚠️ محدودیت مهم: تغییر مسیر سراسری
نکته مهم این است که CWD متعلق به کل Process است، نه یک تابع یا Thread خاص.
مثلاً:
تا زمانی که داخل
در این حالت Python فایل را نسبت به:
جستوجو میکند.
🔥 مشکل در Threadها
فرض کنیم دو Thread داریم:
اگر
چون CWD متعلق به Thread اول نیست؛ وضعیت کل Process تغییر کرده است.
بنابراین در برنامههای چندنخی، تغییر CWD میتواند باعث رفتارهای غیرقابلپیشبینی شود.
🔹 حتی توابع دیگر هم تحت تأثیر قرار میگیرند
مثلاً:
حالا:
تابع
یعنی تغییر CWD میتواند روی کدهای دیگری که از مسیر نسبی استفاده میکنند نیز اثر بگذارد.
✅ راهکار بهتر در بسیاری از موارد
بهجای تغییر CWD، میتوانیم مسیر فایل را مستقیماً مشخص کنیم:
در این روش، تابع به CWD سراسری وابسته نیست.
🔹 تفاوت با
میتوانیم مستقیماً بنویسیم:
اما در این حالت باید خودمان مسیر قبلی را ذخیره و بعداً برگردانیم.
پس تغییر مسیر موقت و قابلبازگشت است؛ اما همچنان خاصیت سراسری CWD را دارد.
🧠 خلاصه
⚠️ در کدهای چندنخی یا کدهایی که نباید وضعیت سراسری برنامه را تغییر دهند، بهتر است تا حد امکان از مسیرهای صریح با
🎯 تمرین
ساختار زیر را در نظر بگیر:
برنامهای بنویس که:
مسیر فعلی را چاپ کند.
با
بعد از خروج از
باید مشاهده کنی که مسیر بعد از
پست ۱۴۰ از دوره جامع Python 🐍
تغییر موقت پوشه کاری با
contextlib.chdir()گاهی برنامه لازم دارد برای مدت کوتاهی در یک پوشه خاص کار کند و بعد از اتمام عملیات، به پوشه قبلی برگردد.
در Python میتوانیم از
chdir() در contextlib استفاده کنیم.contextlib.chdir()از Python 3.11 اضافه شده است.
🔹 استفاده ساده
from contextlib import chdir
import os
print(os.getcwd())
with chdir("data"):
print(os.getcwd())
print(os.getcwd())
اگر پوشه
data وجود داشته باشد:C:\project
C:\project\data
C:\project
یعنی:
قبل از with → پوشه اصلی
داخل with → پوشه data
بعد از with → پوشه اصلی
🔹 چرا
chdir() مفید است؟فرض کنید:
project/
├── main.py
└── data/
├── users.txt
└── products.txt
میتوانیم موقتاً وارد
data شویم:from contextlib import chdir
with chdir("data"):
with open("users.txt", "r") as file:
print(file.read())
داخل
with، مسیر نسبی users.txt نسبت به پوشه data بررسی میشود.🔹 بازگشت خودکار
اگر خطایی هم رخ دهد، مسیر قبلی بازگردانده میشود:
from contextlib import chdir
try:
with chdir("data"):
print("Inside data")
raise ValueError("Something went wrong")
except ValueError:
print("Error handled")
بعد از خروج از
with، CWD دوباره به مسیر قبلی برمیگردد.⚠️ محدودیت مهم: تغییر مسیر سراسری
نکته مهم این است که CWD متعلق به کل Process است، نه یک تابع یا Thread خاص.
مثلاً:
from contextlib import chdir
import os
with chdir("data"):
print(os.getcwd())
تا زمانی که داخل
with هستیم، هر کدی که از مسیر نسبی استفاده کند، تغییر مسیر را میبیند:open("file.txt")در این حالت Python فایل را نسبت به:
data/file.txt
جستوجو میکند.
🔥 مشکل در Threadها
فرض کنیم دو Thread داریم:
def worker_a():
os.chdir("folder_a")
def worker_b():
open("file.txt")
اگر
worker_a مسیر کاری را تغییر دهد، worker_b هم ممکن است مسیر جدید را ببیند.چون CWD متعلق به Thread اول نیست؛ وضعیت کل Process تغییر کرده است.
بنابراین در برنامههای چندنخی، تغییر CWD میتواند باعث رفتارهای غیرقابلپیشبینی شود.
🔹 حتی توابع دیگر هم تحت تأثیر قرار میگیرند
مثلاً:
def load_config():
return open("config.json")
حالا:
from contextlib import chdir
with chdir("data"):
load_config()
تابع
load_config() هیچ اطلاعی از data ندارد، اما فایل را نسبت به پوشه جدید جستوجو میکند.یعنی تغییر CWD میتواند روی کدهای دیگری که از مسیر نسبی استفاده میکنند نیز اثر بگذارد.
✅ راهکار بهتر در بسیاری از موارد
بهجای تغییر CWD، میتوانیم مسیر فایل را مستقیماً مشخص کنیم:
from pathlib import Path
base = Path("data")
file_path = base / "config.json"
with open(file_path) as file:
print(file.read())
در این روش، تابع به CWD سراسری وابسته نیست.
🔹 تفاوت با
os.chdir()میتوانیم مستقیماً بنویسیم:
import os
os.chdir("data")
اما در این حالت باید خودمان مسیر قبلی را ذخیره و بعداً برگردانیم.
contextlib.chdir() این کار را بهصورت Context Manager انجام میدهد:from contextlib import chdir
with chdir("data"):
...
پس تغییر مسیر موقت و قابلبازگشت است؛ اما همچنان خاصیت سراسری CWD را دارد.
🧠 خلاصه
CWD
↓
متعلق به کل Process
↓
همه کدهای استفادهکننده از مسیر نسبی آن را میبینند
chdir(path)
↓
تغییر موقت CWD
↓
اجرای کد
↓
بازگشت خودکار به مسیر قبلی
⚠️ در کدهای چندنخی یا کدهایی که نباید وضعیت سراسری برنامه را تغییر دهند، بهتر است تا حد امکان از مسیرهای صریح با
pathlib استفاده کنیم.🎯 تمرین
ساختار زیر را در نظر بگیر:
project/
├── main.py
└── files/
└── data.txt
برنامهای بنویس که:
مسیر فعلی را چاپ کند.
با
chdir() وارد files شود.data.txt را باز کند و محتوایش را چاپ کند.بعد از خروج از
with دوباره مسیر فعلی را چاپ کند.باید مشاهده کنی که مسیر بعد از
with به مسیر قبلی برگشته است.پست ۱۴۰ از دوره جامع Python 🐍
1
🐍 آموزش جامع Python — پست ۱۴۱
کار با مسیرها با
تا اینجا برای کار با مسیرها از رشتههایی مثل:
و همچنین
اما در Python یک روش مدرنتر و خواناتر برای کار با مسیرها وجود دارد:
🔹 ساخت یک مسیر
ابتدا
خروجی:
🔹 ساخت مسیرهای تو در تو
بهجای چسباندن رشتهها با
خروجی:
این
🔹 ساخت پوشههای تو در تو
فرض کنیم میخواهیم این ساختار را ایجاد کنیم:
میتوانیم بنویسیم:
اینجا:
یعنی اگر پوشههای والد وجود نداشته باشند، آنها را هم بساز.
بنابراین اگر هیچکدام از این پوشهها وجود نداشته باشند:
هر سه پوشه ساخته میشوند.
گزینه:
یعنی اگر پوشهها از قبل وجود داشته باشند، Python خطا ندهد.
پس ترکیب:
برای ساخت پوشههای تودرتو بسیار کاربردی است.
🔹 تفاوت
این دو گزینه کار متفاوتی انجام میدهند:
مثلاً:
حتی اگر
🔹 بررسی وجود مسیر
با
نتیجه:
یا:
🔹 فایل است یا پوشه؟
اگر
🔹 ساخت یک پوشه ساده
اگر فقط یک پوشه را بخواهیم ایجاد کنیم:
در این حالت چون فقط خود
🔹 نام فایل و پسوند
فرض کنیم:
خروجی:
یعنی:
⚠️ نکته مهم
میتوانیم از آن برای:
فایلها
پوشهها
مسیرهای نسبی
مسیرهای مطلق
ترکیب مسیرها
ساخت پوشههای تودرتو
استفاده کنیم.
همچنین استفاده از
🧠 خلاصه
برای ساخت پوشههای تودرتو:
🎯 تمرین
کدی بنویس که:
مسیر
حتی اگر
اگر پوشهها از قبل وجود داشتند، خطا ندهد.
مسیر فایل
نام فایل و پسوند آن را چاپ کند.
شروع:
پست ۱۴۱ از دوره جامع Python 🐍
کار با مسیرها با
pathlibتا اینجا برای کار با مسیرها از رشتههایی مثل:
"data/config.json"
و همچنین
os استفاده کردیم.اما در Python یک روش مدرنتر و خواناتر برای کار با مسیرها وجود دارد:
pathlib
🔹 ساخت یک مسیر
ابتدا
Path را import میکنیم:from pathlib import Path
path = Path("data")
print(path)
خروجی:
data
Path مسیر را بهصورت یک شیء در اختیار ما قرار میدهد.🔹 ساخت مسیرهای تو در تو
بهجای چسباندن رشتهها با
+، میتوانیم از / برای ترکیب مسیرها استفاده کنیم:from pathlib import Path
base = Path("project")
file_path = base / "data" / "users.txt"
print(file_path)
خروجی:
project/data/users.txt
این
/ در pathlib به معنی تقسیم نیست؛ برای ترکیب مسیرها استفاده میشود.🔹 ساخت پوشههای تو در تو
فرض کنیم میخواهیم این ساختار را ایجاد کنیم:
project/
└── data/
└── users/
میتوانیم بنویسیم:
from pathlib import Path
path = Path("project/data/users")
path.mkdir(parents=True, exist_ok=True)
اینجا:
parents=True
یعنی اگر پوشههای والد وجود نداشته باشند، آنها را هم بساز.
بنابراین اگر هیچکدام از این پوشهها وجود نداشته باشند:
project
└── data
└── users
هر سه پوشه ساخته میشوند.
گزینه:
exist_ok=True
یعنی اگر پوشهها از قبل وجود داشته باشند، Python خطا ندهد.
پس ترکیب:
mkdir(parents=True, exist_ok=True)
برای ساخت پوشههای تودرتو بسیار کاربردی است.
🔹 تفاوت
parents=True و exist_ok=Trueاین دو گزینه کار متفاوتی انجام میدهند:
parents=True
→ پوشههای والد را هم ایجاد کن
exist_ok=True
→ اگر پوشه از قبل وجود داشت، خطا نده
مثلاً:
Path("project/data/users").mkdir(
parents=True,
exist_ok=True
)حتی اگر
project و data وجود نداشته باشند، Python مسیر را ایجاد میکند.🔹 بررسی وجود مسیر
با
exists() میتوانیم بررسی کنیم مسیر وجود دارد یا نه:from pathlib import Path
path = Path("data")
print(path.exists())
نتیجه:
True
یا:
False
🔹 فایل است یا پوشه؟
Path متدهای مختلفی برای بررسی نوع مسیر دارد:from pathlib import Path
path = Path("data")
print(path.is_file())
print(path.is_dir())
اگر
data یک پوشه باشد:False
True
🔹 ساخت یک پوشه ساده
اگر فقط یک پوشه را بخواهیم ایجاد کنیم:
from pathlib import Path
path = Path("data")
path.mkdir(exist_ok=True)
در این حالت چون فقط خود
data را میسازیم، نیازی به parents=True نداریم.🔹 نام فایل و پسوند
فرض کنیم:
from pathlib import Path
path = Path("data/users.txt")
print(path.name)
print(path.stem)
print(path.suffix)
خروجی:
users.txt
users
.txt
یعنی:
name → نام کامل فایل
stem → نام فایل بدون پسوند
suffix → پسوند فایل
⚠️ نکته مهم
pathlib فقط مخصوص فایلها نیست.میتوانیم از آن برای:
فایلها
پوشهها
مسیرهای نسبی
مسیرهای مطلق
ترکیب مسیرها
ساخت پوشههای تودرتو
استفاده کنیم.
همچنین استفاده از
Path باعث میشود کد مدیریت مسیرها خواناتر و قابلحملتر باشد.🧠 خلاصه
from pathlib import Path
path = Path("data")
path.exists() # وجود دارد؟
path.is_file() # فایل است؟
path.is_dir() # پوشه است؟
path.mkdir() # ساخت پوشه
path.name # نام کامل
path.stem # نام بدون پسوند
path.suffix # پسوند
برای ساخت پوشههای تودرتو:
path.mkdir(
parents=True,
exist_ok=True
)
🎯 تمرین
کدی بنویس که:
مسیر
project/data/users را ایجاد کند.حتی اگر
project و data وجود نداشتند، آنها را هم بسازد.اگر پوشهها از قبل وجود داشتند، خطا ندهد.
مسیر فایل
users.json را داخل پوشه users بسازد.نام فایل و پسوند آن را چاپ کند.
شروع:
from pathlib import Path
users_dir = Path("project/data/users")
پست ۱۴۱ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۴۲
خواندن و نوشتن فایل با
در پست قبل با
حالا میتوانیم با
🔹 نوشتن در فایل با
اگر فایل وجود نداشته باشد، ساخته میشود.
⚠️ اما اگر پوشه
🔹 ساخت پوشه والد قبل از فایل
برای اطمینان، میتوانیم ابتدا پوشه والد فایل را بسازیم:
اینجا:
پوشه والد فایل را برمیگرداند:
و:
پوشه
اگر پوشههای والد بیشتری داشته باشیم،
مثلاً:
ساختار زیر ایجاد میشود:
🔹 خواندن فایل با
بعد از نوشتن میتوانیم فایل را بخوانیم:
خروجی:
🔹 نوشتن چند خط
میتوانیم از
محتوای فایل:
🔹 خواندن همه محتوا
خروجی:
⚠️ نکته مهم درباره
برای فایلهای متنی، مخصوصاً زمانی که فارسی داریم، بهتر است encoding را مشخص کنیم:
مثلاً:
خروجی:
🔹 تفاوت با
قبلاً برای کار با فایلها میتوانستیم از:
استفاده کنیم.
با
و:
استفاده کنیم.
⚠️ نکته مهم
در پایان محتوای فایل:
خواهد بود.
برای اضافهکردن محتوا به انتهای فایل، بعداً روش مناسب آن را بررسی میکنیم.
🧠 خلاصه
یعنی:
🎯 تمرین
برنامهای بنویس که:
مسیر
تمام پوشههای والد را در صورت نیاز بسازد.
داخل فایل نام و سن یک کاربر را بنویسد.
فایل را دوباره بخواند.
محتوای آن را چاپ کند.
مثلاً:
پست ۱۴۲ از دوره جامع Python 🐍
خواندن و نوشتن فایل با
pathlibدر پست قبل با
Path و ساخت مسیرها آشنا شدیم.حالا میتوانیم با
Path مستقیماً فایل متنی را بخوانیم و بنویسیم.🔹 نوشتن در فایل با
write_text()from pathlib import Path
file = Path("data/message.txt")
file.write_text("Hello Python", encoding="utf-8")
اگر فایل وجود نداشته باشد، ساخته میشود.
⚠️ اما اگر پوشه
data وجود نداشته باشد، write_text() خودش آن را ایجاد نمیکند و با خطا مواجه میشویم.🔹 ساخت پوشه والد قبل از فایل
برای اطمینان، میتوانیم ابتدا پوشه والد فایل را بسازیم:
from pathlib import Path
file = Path("data/message.txt")
file.parent.mkdir(parents=True, exist_ok=True)
file.write_text("Hello Python", encoding="utf-8")
اینجا:
file.parent
پوشه والد فایل را برمیگرداند:
data
و:
file.parent.mkdir(
parents=True,
exist_ok=True
)
پوشه
data را ایجاد میکند.اگر پوشههای والد بیشتری داشته باشیم،
parents=True همه آنها را ایجاد میکند.مثلاً:
from pathlib import Path
file = Path("project/data/users/info.txt")
file.parent.mkdir(parents=True, exist_ok=True)
file.write_text("Ali", encoding="utf-8")
ساختار زیر ایجاد میشود:
project/
└── data/
└── users/
└── info.txt
🔹 خواندن فایل با
read_text()بعد از نوشتن میتوانیم فایل را بخوانیم:
from pathlib import Path
file = Path("data/message.txt")
text = file.read_text(encoding="utf-8")
print(text)
خروجی:
Hello Python
🔹 نوشتن چند خط
میتوانیم از
\n برای ایجاد خط جدید استفاده کنیم:from pathlib import Path
file = Path("data/users.txt")
file.parent.mkdir(parents=True, exist_ok=True)
file.write_text(
"Ali\nSara\nReza",
encoding="utf-8"
)
محتوای فایل:
Ali
Sara
Reza
🔹 خواندن همه محتوا
read_text() کل محتوای فایل را بهصورت یک str برمیگرداند:text = file.read_text(encoding="utf-8")
print(type(text))
خروجی:
<class 'str'>
⚠️ نکته مهم درباره
encodingبرای فایلهای متنی، مخصوصاً زمانی که فارسی داریم، بهتر است encoding را مشخص کنیم:
encoding="utf-8"
مثلاً:
from pathlib import Path
file = Path("data/message.txt")
file.parent.mkdir(parents=True, exist_ok=True)
file.write_text(
"سلام Python",
encoding="utf-8"
)
print(file.read_text(encoding="utf-8"))
خروجی:
سلام Python
🔹 تفاوت با
open()قبلاً برای کار با فایلها میتوانستیم از:
open()
استفاده کنیم.
با
pathlib برای عملیات ساده متنی میتوانیم مستقیماً از:file.write_text(...)
و:
file.read_text(...)
استفاده کنیم.
⚠️ نکته مهم
write_text() محتوای قبلی فایل را جایگزین میکند:file.write_text("First", encoding="utf-8")
file.write_text("Second", encoding="utf-8")در پایان محتوای فایل:
Second
خواهد بود.
برای اضافهکردن محتوا به انتهای فایل، بعداً روش مناسب آن را بررسی میکنیم.
🧠 خلاصه
from pathlib import Path
file = Path("data/message.txt")
file.parent.mkdir(parents=True, exist_ok=True)
file.write_text("Hello", encoding="utf-8")
text = file.read_text(encoding="utf-8")
یعنی:
file.parent → پوشه والد فایل
mkdir() → ساخت پوشه
write_text → نوشتن متن
read_text → خواندن متن
🎯 تمرین
برنامهای بنویس که:
مسیر
project/data/users/info.txt را ایجاد کند.تمام پوشههای والد را در صورت نیاز بسازد.
داخل فایل نام و سن یک کاربر را بنویسد.
فایل را دوباره بخواند.
محتوای آن را چاپ کند.
مثلاً:
Name: Ali
Age: 25
پست ۱۴۲ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۴۳
اضافه کردن محتوا به فایل با حالت
در پست قبل یاد گرفتیم
اما گاهی نمیخواهیم اطلاعات قبلی حذف شود؛ میخواهیم متن جدید را به انتهای فایل اضافه کنیم.
برای این کار از حالت:
استفاده میکنیم.
🔹 اضافه کردن متن به فایل
با
اگر فایل قبلاً این محتوا را داشته باشد:
بعد از اجرای کد:
خواهد شد.
🔹 تفاوت
حالت
محتوای قبلی حذف میشود.
اما حالت
محتوای قبلی باقی میماند و متن جدید به انتهای فایل اضافه میشود.
🔹 یک مثال کاربردی
فرض کنیم میخواهیم کاربران را یکییکی به فایل اضافه کنیم:
محتوای فایل:
هر بار که فایل با حالت
🔹 چرا از
این روش برای مدیریت فایلها امنتر و استانداردتر است.
⚠️ نکته مهم درباره
اگر میخواهیم هر مقدار در یک خط جدید قرار بگیرد، باید خط جدید ایجاد کنیم:
اگر
نتیجه:
اما:
نتیجه:
🧠 خلاصه
مثلاً برای اضافه کردن:
🎯 تمرین
برنامهای بنویس که:
فایل
عبارت
دوباره همین برنامه را اجرا کن و تفاوت را ببین.
در هر اجرا، متن در یک خط جدید اضافه شود.
کد را طوری بنویس که اطلاعات قبلی فایل حذف نشود.
پست ۱۴۳ از دوره جامع Python 🐍
اضافه کردن محتوا به فایل با حالت
appendدر پست قبل یاد گرفتیم
write_text() محتوای فایل را جایگزین میکند.اما گاهی نمیخواهیم اطلاعات قبلی حذف شود؛ میخواهیم متن جدید را به انتهای فایل اضافه کنیم.
برای این کار از حالت:
"a"
استفاده میکنیم.
🔹 اضافه کردن متن به فایل
با
Path.open() میتوانیم فایل را در حالت append باز کنیم:from pathlib import Path
file = Path("data/users.txt")
with file.open("a", encoding="utf-8") as f:
f.write("Ali\n")
اگر فایل قبلاً این محتوا را داشته باشد:
Sara
Reza
بعد از اجرای کد:
Sara
Reza
Ali
خواهد شد.
🔹 تفاوت
w و aحالت
w برای نوشتن و جایگزین کردن محتوا است:with file.open("w", encoding="utf-8") as f:
f.write("Ali\n")محتوای قبلی حذف میشود.
اما حالت
a برای اضافه کردن است:with file.open("a", encoding="utf-8") as f:
f.write("Ali\n")محتوای قبلی باقی میماند و متن جدید به انتهای فایل اضافه میشود.
🔹 یک مثال کاربردی
فرض کنیم میخواهیم کاربران را یکییکی به فایل اضافه کنیم:
from pathlib import Path
file = Path("data/users.txt")
with file.open("a", encoding="utf-8") as f:
f.write("Ali\n")
with file.open("a", encoding="utf-8") as f:
f.write("Sara\n")
with file.open("a", encoding="utf-8") as f:
f.write("Reza\n")
محتوای فایل:
Ali
Sara
Reza
هر بار که فایل با حالت
a باز میشود، اطلاعات جدید به انتهای آن اضافه میشود.🔹 چرا از
with استفاده میکنیم؟with file.open("a", encoding="utf-8") as f:
f.write("Ali\n")with باعث میشود بعد از پایان کار، فایل بهدرستی بسته شود.این روش برای مدیریت فایلها امنتر و استانداردتر است.
⚠️ نکته مهم درباره
\nاگر میخواهیم هر مقدار در یک خط جدید قرار بگیرد، باید خط جدید ایجاد کنیم:
f.write("Ali\n")اگر
\n نگذاریم:f.write("Ali")
f.write("Sara")نتیجه:
AliSara
اما:
f.write("Ali\n")
f.write("Sara\n")نتیجه:
Ali
Sara
🧠 خلاصه
"w" → نوشتن و جایگزین کردن محتوا
"a" → اضافه کردن محتوا به انتهای فایل
"r" → خواندن فایل
مثلاً برای اضافه کردن:
with file.open("a", encoding="utf-8") as f:
f.write("New data\n")🎯 تمرین
برنامهای بنویس که:
فایل
data/log.txt را باز کند.عبارت
Program started را به انتهای فایل اضافه کند.دوباره همین برنامه را اجرا کن و تفاوت را ببین.
در هر اجرا، متن در یک خط جدید اضافه شود.
کد را طوری بنویس که اطلاعات قبلی فایل حذف نشود.
پست ۱۴۳ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۴۴
خواندن فایل خطبهخط با
در پستهای قبل یاد گرفتیم کل محتوای فایل را با
اما همیشه لازم نیست کل فایل را یکجا بخوانیم.
گاهی میخواهیم فایل را خطبهخط پردازش کنیم.
🔹
متد
اگر فایل این باشد:
خروجی:
هر بار که
🔹
اگر فایل:
باشد، نتیجه چیزی شبیه این است:
دقت کن
🔹 پردازش خطبهخط با
در بسیاری از مواقع لازم نیست از
خود فایل قابل پیمایش است:
این روش برای خواندن فایلهای بزرگ بسیار مناسبتر است، چون همه خطوط را یکجا داخل یک لیست قرار نمیدهد.
🔹 حذف
اگر نمیخواهیم خط جدید همراه متن باقی بماند:
اگر فایل:
باشد، هر خط بهصورت تمیز پردازش میشود.
⚠️ تفاوت مهم
برای فایلهای کوچک، هر سه روش میتوانند مناسب باشند.
برای فایلهای بزرگ، پیمایش خطبهخط معمولاً انتخاب مناسبتری است.
🧠 یک مثال کاربردی
فرض کنیم فایل شامل نمرهها باشد:
میتوانیم آنها را خطبهخط بخوانیم:
خروجی:
اینجا:
متن خط را تمیز میکند و:
آن را به عدد صحیح تبدیل میکند.
🧠 خلاصه
یک خط.
تمام خطوط به شکل لیست.
پردازش خطبهخط.
🎯 تمرین
فایلی به نام:
بساز و داخل آن قرار بده:
سپس برنامهای بنویس که:
فایل را باز کند.
اعداد را خطبهخط بخواند.
هر خط را به
مجموع اعداد را محاسبه کند.
مجموع را چاپ کند.
خروجی مورد انتظار:
پست ۱۴۴ از دوره جامع Python 🐍
خواندن فایل خطبهخط با
readlines() و readline()در پستهای قبل یاد گرفتیم کل محتوای فایل را با
read_text() بخوانیم.اما همیشه لازم نیست کل فایل را یکجا بخوانیم.
گاهی میخواهیم فایل را خطبهخط پردازش کنیم.
🔹
readline()متد
readline() یک خط از فایل را میخواند:from pathlib import Path
file = Path("data/users.txt")
with file.open("r", encoding="utf-8") as f:
print(f.readline())
print(f.readline())
اگر فایل این باشد:
Ali
Sara
Reza
خروجی:
Ali
Sara
هر بار که
readline() را اجرا میکنیم، به خط بعدی میرویم.🔹
readlines()readlines() تمام خطوط فایل را میخواند و آنها را داخل یک لیست قرار میدهد:from pathlib import Path
file = Path("data/users.txt")
with file.open("r", encoding="utf-8") as f:
lines = f.readlines()
print(lines)
اگر فایل:
Ali
Sara
Reza
باشد، نتیجه چیزی شبیه این است:
['Ali\n', 'Sara\n', 'Reza\n']
دقت کن
\n نیز ممکن است داخل رشته هر خط وجود داشته باشد.🔹 پردازش خطبهخط با
forدر بسیاری از مواقع لازم نیست از
readlines() استفاده کنیم.خود فایل قابل پیمایش است:
from pathlib import Path
file = Path("data/users.txt")
with file.open("r", encoding="utf-8") as f:
for line in f:
print(line)
این روش برای خواندن فایلهای بزرگ بسیار مناسبتر است، چون همه خطوط را یکجا داخل یک لیست قرار نمیدهد.
🔹 حذف
\n با strip()اگر نمیخواهیم خط جدید همراه متن باقی بماند:
from pathlib import Path
file = Path("data/users.txt")
with file.open("r", encoding="utf-8") as f:
for line in f:
print(line.strip())
اگر فایل:
Ali
Sara
Reza
باشد، هر خط بهصورت تمیز پردازش میشود.
⚠️ تفاوت مهم
readline()
→ یک خط را میخواند
readlines()
→ همه خطوط را در یک لیست قرار میدهد
for line in file
→ فایل را خطبهخط پیمایش میکند
برای فایلهای کوچک، هر سه روش میتوانند مناسب باشند.
برای فایلهای بزرگ، پیمایش خطبهخط معمولاً انتخاب مناسبتری است.
🧠 یک مثال کاربردی
فرض کنیم فایل شامل نمرهها باشد:
18
15
20
12
میتوانیم آنها را خطبهخط بخوانیم:
from pathlib import Path
file = Path("data/scores.txt")
with file.open("r", encoding="utf-8") as f:
for line in f:
score = int(line.strip())
print(score)
خروجی:
18
15
20
12
اینجا:
line.strip()
متن خط را تمیز میکند و:
int(...)
آن را به عدد صحیح تبدیل میکند.
🧠 خلاصه
f.readline()
یک خط.
f.readlines()
تمام خطوط به شکل لیست.
for line in f:
پردازش خطبهخط.
🎯 تمرین
فایلی به نام:
data/numbers.txt
بساز و داخل آن قرار بده:
10
20
30
40
سپس برنامهای بنویس که:
فایل را باز کند.
اعداد را خطبهخط بخواند.
هر خط را به
int تبدیل کند.مجموع اعداد را محاسبه کند.
مجموع را چاپ کند.
خروجی مورد انتظار:
100
پست ۱۴۴ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۴۵
کپی، انتقال و حذف فایل و پوشه با
حالا که با ساخت، خواندن و نوشتن فایلها آشنا شدیم، وقت آن است که عملیات مدیریتی روی فایلها و پوشهها را یاد بگیریم.
برای این کار میتوانیم از
🔹 کپی کردن فایل
برای کپی فایل از
در اینجا:
محتوای فایل اصلی حفظ میشود و یک نسخه در
🔹 انتقال یا تغییر نام فایل
برای انتقال فایل میتوانیم از
بعد از اجرا:
دیگر وجود ندارد و فایل به:
منتقل شده است.
🔹 حذف یک فایل
برای حذف فایل میتوانیم از
بعد از اجرای این کد، فایل حذف میشود.
⚠️
🔹 بررسی قبل از حذف
بهتر است قبل از حذف، وجود فایل را بررسی کنیم:
🔹 حذف پوشه خالی
برای حذف یک پوشه خالی:
⚠️
اگر داخل پوشه فایل یا پوشه دیگری وجود داشته باشد، حذف انجام نمیشود.
🔹 حذف پوشه دارای محتوا
برای حذف یک پوشه همراه با تمام محتویات آن از
⚠️ این عملیات میتواند تمام فایلها و پوشههای داخل مسیر را حذف کند؛ بنابراین باید با دقت استفاده شود.
🧠 خلاصه
🎯 تمرین
ساختار زیر را در نظر بگیر:
برنامهای بنویس که:
فایل
فایل اصلی را به
وجود فایل منتقلشده را بررسی کند.
در صورت وجود، آن را حذف کند.
پست ۱۴۵ از دوره جامع Python 🐍
کپی، انتقال و حذف فایل و پوشه با
pathlibحالا که با ساخت، خواندن و نوشتن فایلها آشنا شدیم، وقت آن است که عملیات مدیریتی روی فایلها و پوشهها را یاد بگیریم.
برای این کار میتوانیم از
shutil در کنار pathlib استفاده کنیم.🔹 کپی کردن فایل
برای کپی فایل از
shutil.copy2() استفاده میکنیم:from pathlib import Path
import shutil
source = Path("data/users.txt")
destination = Path("backup/users.txt")
destination.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(source, destination)
در اینجا:
source → فایل اصلی
destination → محل کپی
محتوای فایل اصلی حفظ میشود و یک نسخه در
backup ایجاد میشود.🔹 انتقال یا تغییر نام فایل
برای انتقال فایل میتوانیم از
shutil.move() استفاده کنیم:from pathlib import Path
import shutil
source = Path("data/users.txt")
destination = Path("archive/users.txt")
destination.parent.mkdir(parents=True, exist_ok=True)
shutil.move(source, destination)
بعد از اجرا:
data/users.txt
دیگر وجود ندارد و فایل به:
archive/users.txt
منتقل شده است.
move() برای تغییر نام هم کاربرد دارد:shutil.move(
"data/old.txt",
"data/new.txt"
)
🔹 حذف یک فایل
برای حذف فایل میتوانیم از
Path.unlink() استفاده کنیم:from pathlib import Path
file = Path("data/users.txt")
file.unlink()
بعد از اجرای این کد، فایل حذف میشود.
⚠️
unlink() را با دقت استفاده کن؛ حذف فایل عملیاتی برگشتپذیر مانند انتقال یا کپی نیست.🔹 بررسی قبل از حذف
بهتر است قبل از حذف، وجود فایل را بررسی کنیم:
from pathlib import Path
file = Path("data/users.txt")
if file.exists():
file.unlink()
🔹 حذف پوشه خالی
برای حذف یک پوشه خالی:
from pathlib import Path
folder = Path("data/old")
folder.rmdir()
⚠️
rmdir() فقط پوشهای را حذف میکند که خالی باشد.اگر داخل پوشه فایل یا پوشه دیگری وجود داشته باشد، حذف انجام نمیشود.
🔹 حذف پوشه دارای محتوا
برای حذف یک پوشه همراه با تمام محتویات آن از
shutil.rmtree() استفاده میشود:from pathlib import Path
import shutil
folder = Path("data/old")
if folder.exists():
shutil.rmtree(folder)
⚠️ این عملیات میتواند تمام فایلها و پوشههای داخل مسیر را حذف کند؛ بنابراین باید با دقت استفاده شود.
🧠 خلاصه
shutil.copy2() → کپی فایل
shutil.move() → انتقال / تغییر نام
Path.unlink() → حذف فایل
Path.rmdir() → حذف پوشه خالی
shutil.rmtree() → حذف پوشه و تمام محتویات
🎯 تمرین
ساختار زیر را در نظر بگیر:
project/
├── data/
│ └── users.txt
└── backup/
برنامهای بنویس که:
فایل
users.txt را داخل backup کپی کند.فایل اصلی را به
archive/users.txt منتقل کند.وجود فایل منتقلشده را بررسی کند.
در صورت وجود، آن را حذف کند.
پست ۱۴۵ از دوره جامع Python 🐍
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