~/icsd.ir — bash
SYSTEM_ONLINE

ابزارهای کاربردی پایتون

در این فصل با ابزارهای کاربردی پایتون آشنا می‌شویم: مصرف API با requests، تاریخ شمسی با jdatetime، عبارت منظم، logging و argparse برای ساخت برنامه‌های CLI حرفه‌ای.

در این فصل با ابزارهای کاربردی پایتون آشنا می‌شویم: مصرف API با requests، تاریخ شمسی با jdatetime، عبارت منظم، logging و argparse برای ساخت برنامه‌های CLI حرفه‌ای.

requests – مصرف API

پکیج requests ساده‌ترین راه برای کار با HTTP در پایتون است:

pip install requests

درخواست GET ساده

import requests

# درخواست GET
response = requests.get("https://api.github.com/users/torvalds")

# بررسی وضعیت
print(response.status_code)    # 200 = موفق

# دریافت JSON
data = response.json()
print(data["name"])            # Linus Torvalds
print(data["followers"])

# هدرها
print(response.headers["Content-Type"])

# متن خام
print(response.text)

پارامترهای Query

params = {
    "q": "python tutorials",
    "lang": "fa",
    "limit": 10
}

response = requests.get("https://api.example.com/search", params=params)
# URL تولید شده: https://api.example.com/search?q=python+tutorials&lang=fa&limit=10

درخواست POST

# ارسال JSON
data = {
    "title": "مقاله جدید",
    "content": "متن مقاله"
}

response = requests.post(
    "https://api.example.com/articles",
    json=data,
    headers={"Authorization": "Bearer YOUR_TOKEN"}
)

if response.status_code == 201:
    print("ایجاد شد:", response.json())
else:
    print(f"خطا: {response.status_code}")

مدیریت خطا

try:
    response = requests.get(
        "https://api.example.com/data",
        timeout=5    # حداکثر ۵ ثانیه
    )
    response.raise_for_status()    # خطا اگر کد خطا باشد
    data = response.json()
except requests.Timeout:
    print("درخواست تایم‌اوت شد")
except requests.HTTPError as e:
    print(f"خطای HTTP: {e}")
except requests.RequestException as e:
    print(f"خطای شبکه: {e}")

دانلود فایل

url = "https://example.com/document.pdf"

response = requests.get(url, stream=True)
with open("document.pdf", "wb") as f:
    for chunk in response.iter_content(chunk_size=8192):
        f.write(chunk)

print("دانلود کامل شد")

jdatetime – تاریخ شمسی

pip install jdatetime
import jdatetime

# تاریخ امروز
today = jdatetime.date.today()
print(today)                     # 1405-02-11

# امروز با زمان
now = jdatetime.datetime.now()
print(now)                       # 1405-02-11 14:30:00

# اجزای تاریخ
print(now.year)                  # 1405
print(now.month)                 # 2
print(now.day)                   # 11
print(now.weekday())             # 0=شنبه ... 6=جمعه

# قالب‌بندی فارسی
print(now.strftime("%A %d %B %Y"))   # شنبه 11 اردیبهشت 1405
print(now.strftime("%Y/%m/%d"))      # 1405/02/11

# تبدیل میلادی به شمسی
from datetime import date
g_date = date(2026, 5, 1)
j_date = jdatetime.date.fromgregorian(date=g_date)
print(j_date)                    # 1405-02-11

# تبدیل شمسی به میلادی
g = jdatetime.date(1405, 2, 11).togregorian()
print(g)                         # 2026-05-01

# اعمال محاسبات
import datetime
yesterday = today - datetime.timedelta(days=1)
print(yesterday)

re – عبارت منظم

regex برای جستجو و دستکاری متن:

import re

# match - از ابتدا تطبیق می‌دهد
text = "Python 3.12"
m = re.match(r"Python", text)
if m:
    print(m.group())         # Python

# search - در کل رشته جستجو
text = "نسخه پایتون: 3.12.4"
m = re.search(r"d+.d+.d+", text)
if m:
    print(m.group())         # 3.12.4

# findall - همه تطبیق‌ها
text = "ali@a.com - zahra@b.com - mohammad@c.org"
emails = re.findall(r"S+@S+.S+", text)
print(emails)
# ['ali@a.com', 'zahra@b.com', 'mohammad@c.org']

# sub - جایگزینی
text = "تلفن: 09121234567 و 09384567890"
masked = re.sub(r"(09d{2})d{7}", r"1*******", text)
print(masked)
# تلفن: 0912******* و 0938*******

# split - تقسیم با الگو
text = "علی, زهرا; محمد | سارا"
parts = re.split(r"[,;|]s*", text)
print(parts)
# ['علی', 'زهرا', 'محمد', 'سارا']

الگوهای رایج

الگو توضیح
d عدد (0-9)
w حرف یا عدد
s فاصله
. هر کاراکتر
* ۰ یا بیشتر
+ ۱ یا بیشتر
? ۰ یا ۱
{n} دقیقاً n بار
^ ابتدای رشته
$ انتهای رشته
[abc] یکی از a، b، c
(...) گروه

مثال‌های کاربردی

# اعتبارسنجی موبایل ایران
def is_iran_mobile(phone):
    return bool(re.match(r"^09d{9}$", phone))

print(is_iran_mobile("09121234567"))    # True
print(is_iran_mobile("0912123"))         # False

# اعتبارسنجی ایمیل
def is_email(s):
    pattern = r"^[w.+-]+@[w-]+.[w.-]+$"
    return bool(re.match(pattern, s))

# استخراج URL
text = "سایت ما https://icsd.ir و https://github.com است"
urls = re.findall(r"https?://S+", text)
print(urls)

# تبدیل اعداد فارسی به انگلیسی با regex
fa_to_en_table = str.maketrans("۰۱۲۳۴۵۶۷۸۹", "0123456789")
text = "تماس: ۰۹۱۲۱۲۳۴۵۶۷"
print(text.translate(fa_to_en_table))

logging – ثبت لاگ

import logging

# تنظیم پایه
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)

logging.debug("جزئیات دیباگ")        # نمایش داده نمی‌شود
logging.info("اطلاعات عمومی")
logging.warning("هشدار")
logging.error("خطا رخ داد")
logging.critical("خطای جدی!")

سطوح لاگ

سطح اولویت کاربرد
DEBUG 10 اطلاعات دقیق دیباگ
INFO 20 پیشرفت معمول
WARNING 30 اخطار
ERROR 40 خطا
CRITICAL 50 خطای بحرانی

لاگ به فایل

logging.basicConfig(
    filename="app.log",
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
    encoding="utf-8"
)

# لاگر مخصوص یک ماژول
logger = logging.getLogger(__name__)
logger.info("ماژول شروع شد")

# لاگ خطا با stack trace
try:
    1 / 0
except Exception:
    logger.exception("خطا در محاسبه")
    # خطا و stack trace هر دو ثبت می‌شود

argparse – برنامه CLI

import argparse

parser = argparse.ArgumentParser(description="ابزار تبدیل تصویر")

# آرگومان مثبت (الزامی)
parser.add_argument("input", help="فایل ورودی")
parser.add_argument("output", help="فایل خروجی")

# آرگومان اختیاری با مقدار
parser.add_argument("-q", "--quality", type=int, default=85,
                    help="کیفیت (0-100)")
parser.add_argument("-w", "--width", type=int, help="عرض جدید")

# Flag (boolean)
parser.add_argument("-v", "--verbose", action="store_true",
                    help="نمایش جزئیات")
parser.add_argument("--no-watermark", action="store_true",
                    help="بدون واترمارک")

# انتخاب از لیست
parser.add_argument("-f", "--format", choices=["jpg", "png", "webp"],
                    default="jpg")

args = parser.parse_args()

print(f"ورودی: {args.input}")
print(f"خروجی: {args.output}")
print(f"کیفیت: {args.quality}")
if args.verbose:
    print("حالت verbose فعال")

اجرا:

python convert.py input.jpg output.png -q 90 --width 800 -v
python convert.py --help    # راهنما خودکار!

مثال کامل: API هواشناسی

import requests
import logging
import argparse
from datetime import datetime

# تنظیم لاگ
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s"
)
logger = logging.getLogger(__name__)

def get_weather(city, api_key):
    """دریافت هوای یک شهر"""
    url = "https://api.openweathermap.org/data/2.5/weather"
    params = {
        "q": city,
        "appid": api_key,
        "units": "metric",
        "lang": "fa"
    }
    
    try:
        logger.info(f"درخواست هوای {city}")
        response = requests.get(url, params=params, timeout=10)
        response.raise_for_status()
        return response.json()
    except requests.Timeout:
        logger.error(f"تایم‌اوت برای {city}")
        return None
    except requests.HTTPError as e:
        logger.error(f"خطای HTTP: {e}")
        return None

def display(data):
    if not data:
        print("داده‌ای دریافت نشد")
        return
    
    print(f"n=== هوای {data['name']} ===")
    print(f"دما: {data['main']['temp']}°C")
    print(f"احساس: {data['main']['feels_like']}°C")
    print(f"رطوبت: {data['main']['humidity']}%")
    print(f"وضعیت: {data['weather'][0]['description']}")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="هواشناسی")
    parser.add_argument("city", help="نام شهر")
    parser.add_argument("--api-key", required=True, help="کلید API")
    args = parser.parse_args()
    
    weather = get_weather(args.city, args.api_key)
    display(weather)

تمرین فصل

🏋️ تمرین ۱: با requests، یک نقل‌قول تصادفی از https://api.quotable.io/random دریافت و چاپ کنید.
🏋️ تمرین ۲: با jdatetime، تابعی بنویسید که سن کاربر را بر اساس تاریخ تولد شمسی او محاسبه کند.
🏋️ تمرین ۳: با regex، یک متن بگیرید و همه شماره موبایل‌های ایرانی داخل آن را استخراج کنید.
🏋️ تمرین ۴: یک ابزار CLI با argparse بنویسید که نام و سن را به‌عنوان آرگومان بگیرد و یک پروفایل کوتاه چاپ کند.

جمع‌بندی

  • requests برای مصرف REST API: GET، POST، JSON
  • jdatetime برای کار با تاریخ شمسی
  • عبارت منظم با re: match، findall، sub
  • logging برای لاگ حرفه‌ای با سطوح مختلف
  • argparse برای ساخت برنامه CLI با راهنمای خودکار

نمایش سایت

رنگ سایت
حالت نمایش
اندازهٔ متن
خوانایی

این تنظیمات فقط روی مرورگر شما ذخیره می‌شود.