حول المحتوى:
في هذا المقال، سنأخذك في جولة عبر أبرز وأقوى العمليات التي يمكنك تنفيذها باستخدام مكتبات بايثون المدمجة. عمليات مدهشة، بعضها بسيط لكن فعّال، وبعضها متقدم يمنحك قدرات تضاهي أدوات خارجية كاملة.
 في عالم البرمجة، لا يتوقف الذكاء على ما تكتبه من كود، بل على معرفتك العميقة بما توفره اللغة من أدوات جاهزة تختصر عليك الجهد والوقت. بايثون، بكل بساطة، ليست فقط لغة سهلة القراءة والكتابة، بل هي كنز مملوء بمكتبات مدمجة تقدم لك قدرات مذهلة قد لا تتخيل وجودها دون تثبيت أي شيء خارجي.
هل فكرت يومًا أنك تستطيع تشغيل خادم ويب، أو ضغط الملفات، أو تحليل الشيفرة البرمجية، أو حتى بناء أداة كاملة تعمل من الطرفية — كل ذلك باستخدام مكتبات مدمجة فقط؟ هذا ليس خيالًا.
في هذا المقال، سنأخذك في جولة عبر أبرز وأقوى العمليات التي يمكنك تنفيذها باستخدام مكتبات بايثون المدمجة. عمليات مدهشة، بعضها بسيط لكن فعّال، وبعضها متقدم يمنحك قدرات تضاهي أدوات خارجية كاملة. هذه المكتبات لا تحتاج إلى تثبيت، فقط تحتاج أن تعرف أنها موجودة وتفهم كيف تستغلها.
gzip و zipfileفي كثير من الأحيان نحتاج إلى التعامل مع الملفات المضغوطة، سواء كان ذلك لاستخراج محتواها أو لإنشاء ملفات صغيرة الحجم تُرسل أو تُخزن بكفاءة. بايثون توفر مكتبتين مدمجتين قويتين لهذا الغرض: gzip و zipfile.
gzipتُستخدم للتعامل مع ملفات .gz، وهي ملفات مضغوطة باستخدام خوارزمية GZIP. يمكنك استخدامها لقراءة أو كتابة الملفات المضغوطة بسهولة، كما في المثال التالي:
import gzip
# كتابة ملف مضغوط
with gzip.open("example.txt.gz", "wt") as f:
    f.write("هذا نص مضغوط باستخدام gzip")
# قراءة الملف المضغوط
with gzip.open("example.txt.gz", "rt") as f:
    content = f.read()
    print(content)
 zipfileتسمح بقراءة وإنشاء أرشيفات .zip. وهي أكثر شمولاً لأنها تدعم احتواء أكثر من ملف داخل أرشيف واحد. المثال التالي يوضح كيفية ضغط ملفات متعددة:
import zipfile
# إنشاء ملف zip يحتوي على ملفات متعددة
with zipfile.ZipFile("archive.zip", "w") as archive:
    archive.write("file1.txt")
    archive.write("file2.txt")
# استخراج الملفات من الأرشيف
with zipfile.ZipFile("archive.zip", "r") as archive:
    archive.extractall("output_folder")
 الجميل في هذه المكتبات أنها لا تحتاج إلى مكتبات خارجية أو تثبيت أي شيء إضافي، ويمكنك استخدامها في أي سكريبت أو أداة تعتمد على التعامل مع الملفات.
os و pathlibبايثون توفر أدوات قوية للتعامل مع نظام الملفات من خلال مكتبتين أساسيتين: os القديمة والموثوقة، وpathlib الحديثة والأكثر مرونة. يمكن استخدامهما لإنشاء مجلدات، حذفها، التنقل بين المجلدات، قراءة أسماء الملفات، واختبار وجود الملفات أو نوعها.
osimport os
# الحصول على الملفات في مجلد معين
files = os.listdir(".")
print(files)
# التأكد إذا ما كان المسار هو ملف
print(os.path.isfile("script.py"))
# إنشاء مجلد جديد
if not os.path.exists("new_folder"):
    os.mkdir("new_folder")
 pathlibpathlib توفر واجهة كائنية أكثر وضوحًا وحداثة:
from pathlib import Path
# تحديد مجلد العمل الحالي
current_dir = Path(".")
# استعراض الملفات فقط داخل المجلد
files = [f for f in current_dir.iterdir() if f.is_file()]
print(files)
# إنشاء مجلد جديد
new_folder = current_dir / "new_folder"
new_folder.mkdir(exist_ok=True)
 pathlib تجعل كتابة الشيفرة أكثر نظافة وتقلل الاعتماد على السلاسل النصية لمسارات الملفات. كما تدعم الجمع بين المسارات باستخدام / بدلاً من دوال os.path.join القديمة.
random و secretsبايثون توفر مكتبتين مدمجتين لتوليد القيم العشوائية، كل واحدة منهما لها استخدام محدد:
random: مناسبة للألعاب والمحاكاة.
secrets: مصممة لتوليد بيانات حساسة وآمنة، مثل كلمات المرور أو الرموز.
randomimport random
# عدد عشـوائي بين رقمين
print(random.randint(1, 100))
# اختيار عنصر عشـوائي من قائمة
print(random.choice(["apple", "banana", "cherry"]))
# ترتيب عشوائي لعناصر قائمة
items = [1, 2, 3, 4, 5]
random.shuffle(items)
print(items)
# توليد عدد عشـوائي بين 0 و 1
print(random.random())
 secrets لتوليد بيانات أكثر أمانًاimport secrets
# توليد عدد عشـوائي آمن بين 0 و 99
print(secrets.randbelow(100))
# اختيار عنصر بشكل غير قابل للتنبؤ
print(secrets.choice(["red", "green", "blue"]))
# توليد رمز عشـوائي يصلح لكلمات المرور
print(secrets.token_hex(16))  # 32 رقم/حرف عشـوائي
 random يستخدم خوارزميات قابلة للتكرار ولا ينصح به في السياقات الأمنية، بينما secrets يستخدم مصادر عشوائية على مستوى النظام، مما يجعله مثاليًا للتشفير وتوليد الرموز الحساسة.
datetime و calendarالتعامل مع الوقت والتاريخ من المهام الأساسية في أي تطبيق حقيقي، سواء لتسجيل الأحداث، جدولة المهام، أو تنسيق التقارير. بايثون توفر مكتبتين مدمجتين: datetime للتحكم الكامل في الكائنات الزمنية، وcalendar لاستعراض الشهور والأسابيع ومعرفة خصائص التقويم.
datetimefrom datetime import datetime, timedelta
# الوقت والتاريخ الحالي
now = datetime.now()
print(now)
# تنسيق التاريخ
print(now.strftime("%Y-%m-%d %H:%M:%S"))
# إضافة أو طرح أيام
yesterday = now - timedelta(days=1)
print("أمس:", yesterday)
# تحويل سلسلة نصية إلى كائن datetime
dt = datetime.strptime("2025-07-04", "%Y-%m-%d")
print(dt)
 calendarimport calendar
# عرض تقويم شهر معين
print(calendar.month(2025, 7))
# معرفة إذا كانت السنة كبيسة
print(calendar.isleap(2024))  # True
# عدد الأيام في شهر معين
print(calendar.monthrange(2025, 7))  # (0, 31) => يبدأ بيوم الأحد، وعدد الأيام 31
 المكتبتان معًا تغطيان كل ما يحتاجه المبرمج من حسابات زمنية، معالجة الفوارق بين التواريخ، توليد تقاويم، أو دعم مناطق زمنية (مع إضافات اختيارية مثل pytz عند الحاجة لاحقًا).
math و decimalعند العمل مع الحسابات الرياضية الدقيقة أو المعقدة، توفر بايثون مكتبتين مدمجتين تساعدان على ذلك: math للعمليات الرياضية الأساسية والثوابت، وdecimal للدقة العالية في الأرقام العشرية التي تتطلب نتائج دقيقة مثل التعاملات المالية.
mathimport math
# الجذر التربيعي
print(math.sqrt(25))
# الجيب وجيب التمام
print(math.sin(math.pi / 2))  # = 1.0
print(math.cos(0))            # = 1.0
# اللوغاريتم الطبيعي
print(math.log(10))
# التقريب للأعلى أو الأسفل
print(math.ceil(4.2))  # = 5
print(math.floor(4.8)) # = 4
# الثوابت الرياضية
print(math.pi)    # 3.14159...
print(math.e)     # 2.71828...
 decimal لحسابات عشرية دقيقةfrom decimal import Decimal, getcontext
# تغيير دقة الأرقام العشرية
getcontext().prec = 6
# عمليات حسابية دقيقة
a = Decimal("1.10")
b = Decimal("2.20")
c = a + b
print(c)  # 3.30 بدون أخطاء التقريب الموجودة في float
# مقارنة مع float
print(1.10 + 2.20)  # 3.3000000000000003
 مكتبة decimal مفيدة جدًا عند الحاجة لنتائج خالية من أخطاء التقريب العائمة (floating-point errors) التي تحدث مع float. وهي شائعة في البرامج المالية أو التي تتطلب دقة عالية في النقاط العشرية.
re للعبارات النمطيةمكتبة re المدمجة في بايثون تتيح البحث داخل النصوص وتحليلها بدقة باستخدام العبارات النمطية (Regular Expressions)، وهي أداة لا غنى عنها لتنظيف البيانات، التحقق من الصيغ، واستخلاص الأنماط من السلاسل النصية.
import re
text = "البريد الإلكتروني هو [email protected]"
match = re.search(r"\w+@\w+\.\w+", text)
if match:
    print("تم العثور على بريد إلكتروني:", match.group())
 text = "الأرقام في النص هي: 42 و 99 و 123"
numbers = re.findall(r"\d+", text)
print(numbers)  # ['42', '99', '123']
 phone = "771234567"
if re.fullmatch(r"\d{9}", phone):
    print("رقم هاتف صحيح")
 text = "مرحبًا بك في الموقع القديم: http://oldsite.com"
updated = re.sub(r"http://\w+\.\w+", "https://newsite.com", text)
print(updated)
 العبارات النمطية تحتاج بعض التعلم، لكنها من أقوى أدوات تحليل النصوص، وتُستخدم في مجالات مثل التحقق من صحة المدخلات، استخراج البيانات من ملفات، بناء محركات بحث، وحتى في برمجة اللغات نفسها.
collections للحصول على تراكيب بيانات محسّنةالمكتبة المدمجة collections في بايثون توفر هياكل بيانات إضافية وفعالة لا تتوفر في الأنواع التقليدية مثل list و dict. هذه الهياكل تحل الكثير من المشكلات الشائعة بطريقة أكثر مرونة وسهولة.
Counter لعدّ العناصرfrom collections import Counter
data = ["apple", "banana", "apple", "orange", "banana", "apple"]
counts = Counter(data)
print(counts)
# الناتج: Counter({'apple': 3, 'banana': 2, 'orange': 1})
 Counter مثالية لتحليل التكرار في البيانات، مثل عد الكلمات أو العناصر.
defaultdict لتفادي الأخطاء مع المفاتيح غير الموجودةfrom collections import defaultdict
d = defaultdict(int)
d["a"] += 1
d["b"] += 2
print(d)
 بعكس القاموس العادي، defaultdict ينشئ القيمة الابتدائية تلقائيًا (مثل 0 أو قائمة أو مجموعة) مما يمنع حدوث KeyError.
namedtuple لإنشاء كائنات تشبه الكلاساتfrom collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
p = Point(3, 4)
print(p.x, p.y)
 namedtuple يوفر طريقة خفيفة وسريعة لتعريف هياكل بيانات قابلة للقراءة، تشبه الكائنات لكن دون كلفة الأداء المرتبطة بالكلاسات.
deque لقوائم مزدوجة النهاية (أداء أعلى من list)from collections import deque
dq = deque([1, 2, 3])
dq.appendleft(0)
dq.append(4)
print(dq)  # deque([0, 1, 2, 3, 4])
dq.pop()
dq.popleft()
print(dq)  # deque([1, 2, 3])
 deque مصممة لعمليات الإضافة والحذف السريعة من الطرفين، وتتفوق على list في الأداء في هذه الحالات.
threading و asyncioفي التطبيقات التي تحتاج إلى تنفيذ عدة مهام في نفس الوقت، مثل تنزيل ملفات، التعامل مع الشبكة، أو تحديث الواجهة أثناء حسابات طويلة، توفر بايثون أسلوبين رئيسيين:
threading للتنفيذ متعدد الخيوط (Multi-threading)
asyncio للبرمجة غير المتزامنة (Asynchronous programming)
threading لتشغيل مهام متوازيةimport threading
import time
def task(name):
    print(f"بدأ {name}")
    time.sleep(2)
    print(f"انتهى {name}")
t1 = threading.Thread(target=task, args=("المهمة 1",))
t2 = threading.Thread(target=task, args=("المهمة 2",))
t1.start()
t2.start()
t1.join()
t2.join()
 threading مفيد عندما تحتاج إلى تشغيل وظائف متعددة لا تعتمد على بعضها وتستفيد من وقت الانتظار (مثل انتظار الشبكة).
asyncio لبرمجة غير متزامنةimport asyncio
async def task(name):
    print(f"بدأ {name}")
    await asyncio.sleep(2)
    print(f"انتهى {name}")
async def main():
    await asyncio.gather(
        task("المهمة A"),
        task("المهمة B")
    )
asyncio.run(main())
 asyncio يسمح بكتابة كود متزامن بطريقة تبدو متسلسلة، مما يجعله مثاليًا في التطبيقات التي تتعامل مع الكثير من الانتظار (مثل واجهات برمجة التطبيقات، قواعد البيانات، الشبكة).
الفرق الرئيسي أن threading يشغل عدة خيوط فعلية، بينما asyncio يدير تدفق التنفيذ داخل خيط واحد بطريقة غير متزامنة باستخدام await.
timeit و cProfileتحسين أداء الكود يبدأ دائمًا بقياسه. بايثون توفر أدوات مدمجة دقيقة تساعد على تحليل سرعة تنفيذ الشيفرة وتحديد الأجزاء البطيئة منها. الأداتان الأكثر استخدامًا هما timeit لقياس زمن تنفيذ المقاطع القصيرة، وcProfile لتحليل الأداء الكامل للبرامج.
timeit لقياس وقت تنفيذ كود بسيطimport timeit
code = "sum(range(1000))"
duration = timeit.timeit(code, number=1000)
print("المدة:", duration)
 يمكنك من خلال timeit مقارنة طريقتين مختلفتين لتحقيق نفس الغرض ومعرفة أيهما أسرع.
cProfile لتحليل الأداء الكاملimport cProfile
def slow_function():
    total = 0
    for i in range(10000):
        total += sum(range(i))
    return total
cProfile.run("slow_function()")
 cProfile يعرض عدد المرات التي تم فيها استدعاء كل دالة، والوقت الذي استغرقته، مما يساعدك على معرفة نقاط الضعف في الأداء.
time لمراقبة الكود يدويًافي بعض الحالات يمكن استخدام time لمراقبة أجزاء محددة يدويًا:
import time
start = time.time()
# كود بطيء هنا
time.sleep(1)
end = time.time()
print("المدة:", end - start)
 هذه الأدوات تجعل عملية تحسين الأداء قائمة على أرقام واقعية بدلاً من التخمين، وهي أساسية في تطوير البرامج التي تتطلب استجابة سريعة أو تعمل على بيانات ضخمة.
shutil و osعند تنفيذ مهام تتعلق بإدارة الملفات على مستوى النظام، مثل نسخ المجلدات، حذف الملفات، أو نقلها، فإن مكتبة shutil بالتعاون مع os تمنحك واجهات قوية وآمنة للتعامل مع هذه العمليات.
shutilimport shutil
# نسخ ملف
shutil.copy("source.txt", "copy.txt")
# نسخ مجلد كامل (بما فيه من ملفات ومجلدات فرعية)
shutil.copytree("original_folder", "backup_folder")
# حذف مجلد ومحتوياته
shutil.rmtree("backup_folder")
 shutil.move("file.txt", "folder/file.txt")
 osimport os
# إنشاء مجلد
os.mkdir("new_dir")
# التحقق من وجود ملف
if os.path.exists("file.txt"):
    os.remove("file.txt")
 shutil تُستخدم كثيرًا في أدوات النسخ الاحتياطي، البرمجيات التي تنظم الملفات تلقائيًا، أو أي سكريبت يتعامل مع النظام بشكل مباشر.
باستخدام هذه الأدوات، يمكنك كتابة أدوات بايثون تتفاعل مباشرة مع بيئة النظام، وتقوم بتنظيم الملفات أو التحكم في هيكل المجلدات بشكل ديناميكي وسلس.
urllib.requestإذا كنت بحاجة إلى تنزيل ملفات أو قراءة محتوى صفحات الإنترنت داخل سكريبت بايثون، يمكنك استخدام مكتبة urllib.request المدمجة، دون الحاجة لأي مكتبات خارجية.
import urllib.request
url = "https://httpbin.org/json"
response = urllib.request.urlopen(url)
data = response.read().decode("utf-8")
print(data)
 url = "https://example.com/file.zip"
urllib.request.urlretrieve(url, "downloaded_file.zip")
 from urllib.request import Request, urlopen
req = Request("https://httpbin.org/get", headers={"User-Agent": "Mozilla/5.0"})
with urlopen(req) as res:
    print(res.read().decode())
 from urllib.error import URLError, HTTPError
try:
    urllib.request.urlopen("https://example.com/notfound")
except HTTPError as e:
    print("خطأ HTTP:", e.code)
except URLError as e:
    print("مشكلة في الاتصال:", e.reason)
 urllib.request تمنحك التحكم الكامل في الاتصال بالويب، وهي كافية لأغلب العمليات البسيطة مثل تحميل الملفات أو قراءة البيانات من API، بدون الحاجة لمكتبات ثقيلة مثل requests إذا لم تكن مثبتة.
ختامًا، رأينا في هذا المقال كيف أن مكتبات بايثون المدمجة ليست مجرد أدوات ثانوية، بل منظومة متكاملة من الإمكانيات التي تغنيك في كثير من الأحيان عن المكتبات الخارجية. من التعامل مع الملفات والأنظمة، إلى تحليل النصوص، إدارة البيانات، تنفيذ الأوامر، وحتى بناء أدوات احترافية — كل ذلك متاح أمامك فور تثبيت بايثون، دون الحاجة إلى أي إضافات.
الفرق بين مبرمج عادي وآخر محترف لا يكمن فقط في كتابة الكود، بل في استغلال الأدوات المتوفرة بأقصى كفاءة. ومع هذه المكتبات، يمكنك بناء تطبيقات قوية، سريعة، ومرنة دون تعقيد.
إذا كنت تستخدم بايثون وتغفل عن هذه الأدوات، فأنت تُهدر جزءًا كبيرًا من قوة اللغة. استثمر وقتك في التعرف عليها وتجربتها، وستتفاجأ بكمّ المشاكل التي يمكنك حلها بسطور قليلة، وبأداء أعلى مما تتوقع.
في هذا المقال، سنأخذك في جولة عبر أبرز وأقوى العمليات التي يمكنك تنفيذها باستخدام مكتبات بايثون المدمجة. عمليات مدهشة، بعضها بسيط لكن فعّال، وبعضها متقدم يمنحك قدرات تضاهي أدوات خارجية كاملة.
مساحة اعلانية
numpy, requests, re
المكتبات في بايثون هي مجموعات من الوحدات والحزم التي توفر أكواد مكتوبة مسبقًا لتنفيذ مهام مختلفة. تساعد في تبسيط عملية البرمجة من خلال توفير دوال وفئات قابلة لإعادة الاستخدام لوظائف محددة، مثل تحليل البيانات، تعلم الآلة، تطوير الويب، والمزيد.
لدى بايثون عدد هائل من المكتبات، مع أكثر من 500,000 حزمة متاحة في فهرس حزم بايثون (PyPI). يستمر هذا العدد في النمو مع تطوير مجتمع بايثون لمكتبات جديدة لتطبيقات متنوعة.