10. نگاهی کوتاه به کتابخانهٔ استاندارد

10.1. رابط سیستم‌عامل

ماژول os ده‌ها تابع برای تعامل با سیستم‌عامل فراهم می‌کند:

>>> import os
>>> os.getcwd()      # مسیر کاری فعلی را برمی‌گرداند
'C:\\Python314'
>>> os.chdir('/server/accesslogs')   # مسیر کاری فعلی را تغییر می‌دهد
>>> os.system('mkdir today')   # دستور mkdir را در پوستهٔ سیستم اجرا می‌کند
0

حتماً از سبک import os به‌جای from os import * استفاده کنید. این کار باعث می‌شود os.open() روی تابع داخلی open() که عملکرد کاملاً متفاوتی دارد، نپوشاند.

توابع داخلی dir() و help() به‌عنوان ابزارهای تعاملی برای کار با ماژول‌های بزرگی مانند os مفید هستند:

>>> import os
>>> dir(os)
<returns a list of all module functions>
>>> help(os)
<returns an extensive manual page created from the module's docstrings>

برای کارهای روزمرهٔ مدیریت فایل‌ها و پوشه‌ها، ماژول shutil یک رابط سطح بالاتر ارائه می‌دهد که استفاده از آن ساده‌تر است:

>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
'archive.db'
>>> shutil.move('/build/executables', 'installdir')
'installdir'

10.2. الگوهای عام فایل

ماژول glob تابعی برای ساخت فهرستی از فایل‌ها با استفاده از جست‌وجوهای الگوی عام در پوشه‌ها فراهم می‌کند:

>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']

10.3. آرگومان‌های خط فرمان

اسکریپت‌های کاربردی معمولاً نیاز دارند آرگومان‌های خط فرمان را پردازش کنند. این آرگومان‌ها در ویژگی argv ماژول sys به‌صورت یک فهرست ذخیره می‌شوند. برای مثال، فایل demo.py زیر را در نظر بگیرید:

# File demo.py
import sys
print(sys.argv)

خروجی اجرای python demo.py one two three در خط فرمان به شکل زیر است:

['demo.py', 'one', 'two', 'three']

ماژول argparse سازوکار پیشرفته‌تری برای پردازش آرگومان‌های خط فرمان فراهم می‌کند. اسکریپت زیر یک یا چند نام فایل و همچنین تعداد اختیاری خطوطی که باید نمایش داده شوند را استخراج می‌کند:

import argparse

parser = argparse.ArgumentParser(
    prog='top',
    description='Show top lines from each file')
parser.add_argument('filenames', nargs='+')
parser.add_argument('-l', '--lines', type=int, default=10)
args = parser.parse_args()
print(args)

هنگامی که این اسکریپت با دستور python top.py --lines=5 alpha.txt beta.txt در خط فرمان اجرا شود، اسکریپت مقدار args.lines را برابر 5 و مقدار args.filenames را برابر ['alpha.txt', 'beta.txt'] قرار می‌دهد.

10.4. تغییر مسیر خروجی خطا و پایان دادن به برنامه

ماژول sys همچنین ویژگی‌هایی برای stdin، stdout و stderr دارد. مورد آخر برای ارسال هشدارها و پیام‌های خطا مفید است، زیرا حتی زمانی که stdout تغییر مسیر داده شده باشد، این پیام‌ها همچنان قابل مشاهده خواهند بود:

>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one

مستقیم‌ترین راه برای پایان دادن به یک اسکریپت استفاده از sys.exit() است.

10.5. تطبیق الگوهای رشته‌ای

ماژول re ابزارهای عبارت باقاعده را برای پردازش پیشرفتهٔ رشته‌ها فراهم می‌کند. برای تطبیق و تغییرات پیچیده، عبارت‌های باقاعده راه‌حل‌هایی کوتاه و بهینه ارائه می‌دهند:

>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'

وقتی فقط به قابلیت‌های ساده نیاز است، استفاده از متدهای رشته‌ای ترجیح داده می‌شود، زیرا خواندن و اشکال‌زدایی آن‌ها آسان‌تر است:

>>> 'tea for too'.replace('too', 'two')
'tea for two'

10.6. ریاضیات

ماژول math دسترسی به توابع کتابخانهٔ C زیرین برای محاسبات ممیز شناور را فراهم می‌کند:

>>> import math
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> math.log(1024, 2)
10.0

ماژول random ابزارهایی برای انتخاب‌های تصادفی فراهم می‌کند:

>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10)   # نمونه‌گیری بدون جایگذاری
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # عدد اعشاری تصادفی از بازهٔ [0.0، 1.0)
0.17970987693706186
>>> random.randrange(6)    # عدد صحیح تصادفی انتخاب‌شده از بازهٔ range(6)
4

ماژول statistics ویژگی‌های آماری پایه (مانند میانگین، میانه، واریانس و غیره) داده‌های عددی را محاسبه می‌کند:

>>> import statistics
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> statistics.mean(data)
1.6071428571428572
>>> statistics.median(data)
1.25
>>> statistics.variance(data)
1.3720238095238095

پروژهٔ SciPy <https://scipy.org> ماژول‌های بسیار دیگری برای محاسبات عددی دارد.

10.7. دسترسی به اینترنت

تعدادی ماژول برای دسترسی به اینترنت و پردازش پروتکل‌های اینترنتی وجود دارد. دو مورد از ساده‌ترین آن‌ها urllib.request برای دریافت داده از URLها و smtplib برای ارسال ایمیل هستند:

>>> from urllib.request import urlopen
>>> with urlopen('https://docs.python.org/3/') as response:
...     for line in response:
...         line = line.decode()             # تبدیل بایت‌ها به یک رشته
...         if 'updated' in line:
...             print(line.rstrip())         # حذف خط جدیدِ انتهایی
...
      Last updated on Nov 11, 2025 (20:11 UTC).

>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
... """To: jcaesar@example.org
... From: soothsayer@example.org
...
... Beware the Ides of March.
... """)
>>> server.quit()

(توجه کنید که مثال دوم به یک سرور ایمیل در حال اجرا روی localhost نیاز دارد.)

10.8. تاریخ‌ها و زمان‌ها

ماژول datetime کلاس‌هایی برای کار با تاریخ‌ها و زمان‌ها به روش‌های ساده و پیچیده فراهم می‌کند. با اینکه محاسبات مربوط به تاریخ و زمان پشتیبانی می‌شوند، تمرکز اصلی پیاده‌سازی بر استخراج کارآمد اعضا برای قالب‌بندی خروجی و تغییرات است. این ماژول همچنین از اشیایی که نسبت به منطقهٔ زمانی آگاه هستند پشتیبانی می‌کند.:

>>> # ساختن و قالب‌بندی تاریخ‌ها به‌سادگی انجام می‌شود
>>> import datetime as dt
>>> now = dt.date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

>>> # تاریخ‌ها از محاسبات تقویمی پشتیبانی می‌کنند
>>> birthday = dt.date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368

10.9. فشرده‌سازی داده‌ها

قالب‌های رایج بایگانی و فشرده‌سازی داده مستقیماً توسط ماژول‌هایی مانند zlib، gzip، bz2، lzma، zipfile و tarfile پشتیبانی می‌شوند.

>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979

10.10. اندازه‌گیری کارایی

برخی کاربران پایتون علاقهٔ زیادی دارند که کارایی نسبی روش‌های مختلف برای حل یک مسئلهٔ یکسان را بدانند. پایتون ابزاری برای اندازه‌گیری فراهم می‌کند که بلافاصله به این پرسش‌ها پاسخ می‌دهد.

برای مثال، ممکن است وسوسه شوید که به‌جای روش سنتی جابه‌جایی آرگومان‌ها، از قابلیت بسته‌بندی و بازکردن تاپل‌ها استفاده کنید. ماژول timeit به‌سرعت یک برتری کوچک در کارایی را نشان می‌دهد:

>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791

برخلاف دقت بسیار بالای timeit در اندازه‌گیری‌های کوچک، ماژول‌های profile و pstats ابزارهایی برای شناسایی بخش‌های حساس از نظر زمانی در قطعه‌کدهای بزرگ‌تر فراهم می‌کنند.

10.11. کنترل کیفیت

یکی از روش‌ها برای توسعهٔ نرم‌افزار با کیفیت بالا این است که برای هر تابع، هم‌زمان با توسعهٔ آن، آزمون‌هایی نوشته شود و این آزمون‌ها در طول فرایند توسعه به‌طور مکرر اجرا شوند.

ماژول doctest ابزاری برای پیمایش یک ماژول و اعتبارسنجی آزمون‌هایی که در رشته‌های مستندات (docstring) برنامه قرار داده شده‌اند فراهم می‌کند. ساخت آزمون‌ها به سادگیِ کپی‌کردن یک فراخوانی معمولی به همراه نتیجهٔ آن در docstring است. این کار مستندات را بهتر می‌کند، زیرا نمونه‌ای برای کاربر فراهم می‌کند و همچنین به ماژول doctest اجازه می‌دهد اطمینان حاصل کند که کد همچنان مطابق با مستندات عمل می‌کند:

def average(values):
    """میانگین حسابیِ یک فهرست از اعداد را محاسبه می‌کند.

    >>> print(average([20, 30, 70]))
    40.0
    """
    return sum(values) / len(values)

import doctest
doctest.testmod()   # آزمون‌های تعبیه‌شده را به‌صورت خودکار اعتبارسنجی می‌کند

ماژول unittest به اندازهٔ doctest ساده و بدون زحمت نیست، اما اجازه می‌دهد مجموعه‌ای جامع‌تر از آزمون‌ها در یک فایل جداگانه نگهداری شود:

import unittest

class TestStatisticalFunctions(unittest.TestCase):

    def test_average(self):
        self.assertEqual(average([20, 30, 70]), 40.0)
        self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
        with self.assertRaises(ZeroDivisionError):
            average([])
        with self.assertRaises(TypeError):
            average(20, 30, 70)

unittest.main()  # فراخوانی از خط فرمان، همهٔ آزمون‌ها را اجرا می‌کند

10.12. همه‌چیز آماده درون جعبه

پایتون از فلسفهٔ «همه‌چیز آماده درون جعبه» (batteries included) پیروی می‌کند. این موضوع را می‌توان به بهترین شکل در قابلیت‌های پیشرفته و قدرتمند بسته‌های بزرگ‌تر آن مشاهده کرد. برای مثال:

  • ماژول‌های xmlrpc.client و xmlrpc.server پیاده‌سازی فراخوانی رویه‌های راه‌دور (Remote Procedure Calls یا RPC) را به کاری تقریباً ساده و بدیهی تبدیل می‌کنند. با وجود نام این ماژول‌ها، نیازی به دانش یا کار مستقیم با XML نیست.

  • بستهٔ email کتابخانه‌ای برای مدیریت پیام‌های ایمیل است که از MIME و سایر قالب‌های پیام مبتنی بر RFC 5322 نیز پشتیبانی می‌کند. برخلاف ماژول‌های smtplib و poplib که وظیفهٔ ارسال و دریافت پیام‌ها را بر عهده دارند، بستهٔ email مجموعه‌ای کامل از ابزارها را برای ساخت یا رمزگشایی ساختارهای پیچیدهٔ پیام (از جمله پیوست‌ها) و همچنین پیاده‌سازی پروتکل‌های کدگذاری اینترنتی و سرآیندهای پیام فراهم می‌کند.

  • بستهٔ json از تجزیه و پردازش این قالب پرکاربرد تبادل داده به‌خوبی پشتیبانی می‌کند. ماژول csv امکان خواندن و نوشتن مستقیم فایل‌ها در قالب مقادیر جداشده با ویرگول (CSV) را فراهم می‌کند؛ قالبی که معمولاً توسط پایگاه‌های داده و نرم‌افزارهای صفحه‌گسترده پشتیبانی می‌شود. پردازش XML نیز توسط بسته‌های xml.etree.ElementTree، xml.dom و xml.sax پشتیبانی می‌شود. در کنار هم، این ماژول‌ها و بسته‌ها تبادل داده میان برنامه‌های پایتون و سایر ابزارها را تا حد زیادی ساده می‌کنند.

  • ماژول sqlite3 پوششی (wrapper) برای کتابخانهٔ پایگاه دادهٔ SQLite است و یک پایگاه دادهٔ پایدار فراهم می‌کند که با استفاده از نگارش اندکی غیراستاندارد SQL قابل به‌روزرسانی و دسترسی است.

  • پشتیبانی از بین‌المللی‌سازی (Internationalization) توسط چندین ماژول، از جمله gettext، locale و بستهٔ codecs فراهم می‌شود.