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

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

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

>>> import os
>>> os.getcwd()      # Return the current working directory
'C:\\Python314'
>>> os.chdir('/server/accesslogs')   # Change current working directory
>>> os.system('mkdir today')   # Run the command mkdir in the system shell
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>

For daily file and directory management tasks, the shutil module provides a higher-level interface that is easier to use:

>>> 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. آرگومان‌های خط فرمان

Common utility scripts often need to process command-line arguments. These arguments are stored in the sys module's argv attribute as a list. For instance, let's take the following demo.py file:

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

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

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

The argparse module provides a more sophisticated mechanism to process command-line arguments. The following script extracts one or more filenames and an optional number of lines to be displayed:

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)   # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # random float from the interval [0.0, 1.0)
0.17970987693706186
>>> random.randrange(6)    # random integer chosen from 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()             # Convert bytes to a str
...         if 'updated' in line:
...             print(line.rstrip())         # Remove trailing newline
...
      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 کلاس‌هایی برای کار با تاریخ‌ها و زمان‌ها به روش‌های ساده و پیچیده فراهم می‌کند. با اینکه محاسبات مربوط به تاریخ و زمان پشتیبانی می‌شوند، تمرکز اصلی پیاده‌سازی بر استخراج کارآمد اعضا برای قالب‌بندی خروجی و تغییرات است. این ماژول همچنین از اشیایی که نسبت به منطقه‌ی زمانی آگاه هستند پشتیبانی می‌کند.:

>>> # dates are easily constructed and formatted
>>> 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.'

>>> # dates support calendar arithmetic
>>> 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 ابزاری برای پویش یک ماژول و اعتبارسنجی آزمون‌های تعبیه‌شده در رشته‌های مستند یک برنامه فراهم می‌کند. ساخت آزمون به سادگیِ بریدن و چسباندن یک فراخوانی معمولی به همراه نتایج آن در رشته‌ی مستند است. این کار با فراهم کردن یک نمونه برای کاربر، مستندات را بهبود می‌دهد و به ماژول doctest اجازه می‌دهد مطمئن شود کد همچنان با مستندات مطابقت دارد:

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

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

import doctest
doctest.testmod()   # automatically validate the embedded tests

ماژول 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()  # Calling from the command line invokes all tests

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 یک پوشش برای کتابخانه پایگاه داده SQLite است که یک پایگاه داده پایا فراهم می‌کند و می‌توان آن را با استفاده از سینتکس SQL کمی غیرمعمول به‌روزرسانی و به آن دسترسی پیدا کرد.

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