ویژگی تصویر

معرفی کتابخانه ftplib در پایتون

  /  پایتون   /  کتابخانه ftplib در پایتون
بنر تبلیغاتی الف

کتابخانه ftplib یکی از ماژول‌های استاندارد پایتون برای ارتباط با سرورهای FTP است. این ماژول امکان اتصال، فهرست‌برداری، بارگذاری و دانلود فایل‌ها و انجام دستورات پایه FTP را فراهم می‌کند. در این مقاله به شکل کاربردی و عملی با ftplib آشنا می‌شویم، مثال‌های واقعی می‌آوریم و نکات فنی و محدودیت‌های آن را بررسی می‌کنیم.

چرا از FTP و ftplib استفاده کنیم؟

  • FTP هنوز در بسیاری از سازمان‌ها برای تبادل فایل‌های بزرگ و اتوماسیون بکاپ استفاده می‌شود.
  • ftplib به صورت پیش‌فرض در پایتون موجود است و برای کارهای ساده و اسکریپت‌های خودکار مناسب است.
  • برای ارتباطات امن‌تر می‌توان از FTP_TLS استفاده کرد؛ اما برای SFTP (بر پایه SSH) باید از کتابخانه‌هایی مثل Paramiko استفاده کنید.

ساختار و کلاس‌های اصلی

کلاس اصلی ftplib، کلاس FTP است. برخی توابع و متدهای پراستفاده:

متدکاربرد
connect(host, port)اتصال به سرور FTP
login(user, passwd)ورود با نام کاربری و رمز
nlst()گرفتن لیست اسامی فایل/پوشه
dir()نمایش اطلاعات مشابه ls -l
retrbinary(cmd, callback)دانلود فایل به صورت باینری
storbinary(cmd, fileobj)آپلود فایل به صورت باینری
retrlines/storlinesانتقال خط‌به‌خط برای متن (ASCII)
quit()خروج از جلسه FTP

مثال پایه: اتصال و فهرست‌برداری

from ftplib import FTP

ftp = FTP()
ftp.connect('ftp.example.com', 21, timeout=10)
ftp.login('username', 'password')
print(ftp.nlst())
ftp.quit()

کد بالا یک اتصال ساده برقرار می‌کند، وارد می‌شود و لیست فایل‌ها/پوشه‌ها را چاپ می‌کند. پارامتر timeout برای جلوگیری از بلوکه شدن طولانی مفید است.

دانلود فایل به صورت باینری با پیگیری پیشرفت

from ftplib import FTP

def download(ftp_host, username, password, remote_path, local_path):
    ftp = FTP(ftp_host, timeout=30)
    ftp.login(username, password)

    with open(local_path, 'wb') as f:
        def callback(data):
            f.write(data)
            # می‌توانید اینجا مقدار پیشرفت را محاسبه و چاپ کنید

        ftp.retrbinary('RETR ' + remote_path, callback, blocksize=8192)

    ftp.quit()

در این مثال از retrbinary برای دانلود باینری استفاده شده است. callback برای نوشتن داده‌های دریافتی در فایل محلی استفاده می‌شود. blocksize اندازه هر بلوک داده است که می‌توان آن را برای بهینه‌سازی تغییر داد.

آپلود فایل (storbinary)

from ftplib import FTP

def upload(ftp_host, username, password, local_path, remote_path):
    ftp = FTP(ftp_host, timeout=30)
    ftp.login(username, password)

    with open(local_path, 'rb') as f:
        ftp.storbinary('STOR ' + remote_path, f, blocksize=8192)

    ftp.quit()

storbinary عملیات آپلود باینری را انجام می‌دهد. فایل به صورت باینری باز شده و به سرور ارسال می‌شود. برای فایل‌های متنی می‌توان از storlines استفاده کرد ولی معمولا storbinary ایمن‌تر و سریع‌تر است.

از سرگیری دانلود (Resuming)

from ftplib import FTP
import os

def resume_download(ftp_host, username, password, remote_path, local_path):
    ftp = FTP(ftp_host, timeout=30)
    ftp.login(username, password)
    local_size = 0
    if os.path.exists(local_path):
        local_size = os.path.getsize(local_path)

    with open(local_path, 'ab') as f:
        def callback(data):
            f.write(data)

        if local_size > 0:
            # از REST برای ادامه استفاده می‌کنیم
            ftp.retrbinary('RETR ' + remote_path, callback, rest=local_size)
        else:
            ftp.retrbinary('RETR ' + remote_path, callback)

    ftp.quit()

در این نمونه ابتدا اندازه فایل محلی چک می‌شود و در صورت وجود، دانلود از آن نقطه ادامه می‌یابد. پارامتر rest در retrbinary برای مشخص کردن بایت شروع استفاده می‌شود.

نکات مهم و بهترین شیوه‌ها

  • FTP به صورت پیش‌فرض رمزنگاری ندارد؛ برای امنیت از FTPS (FTP_TLS) یا SFTP (Paramiko) استفاده کنید.
  • در شبکه‌هایی با NAT یا فایروال ممکن است نیاز به تغییر حالت Passive/Active باشد: ftp.set_pasv(True/False).
  • برای فایل‌های بزرگ از blocksize مناسب (مثلاً 8192 یا 16384) استفاده کنید تا کارایی بهتر شود.
  • برای اشکال‌زدایی از ftp.set_debuglevel(2) استفاده کنید تا تبادل دستورات و پاسخ‌ها دیده شود.
  • متد mlsd برای دریافت اطلاعات ساختاریافته (در صورت پشتیبانی سرور) مفید است.

استفاده از FTP_TLS برای ارتباط امن (FTPS)

from ftplib import FTP_TLS

ftps = FTP_TLS('ftps.example.com', timeout=30)
ftps.login('username', 'password')
ftps.prot_p()  # فعال‌سازی کانال داده امن
ftps.retrbinary('RETR securefile.dat', open('securefile.dat','wb').write)
ftps.quit()

FTP_TLS یک نسخه امن‌تر برای FTPS است. متد prot_p() کانال داده را نیز رمزنگاری می‌کند. توجه داشته باشید که FTPS با SFTP متفاوت است؛ SFTP بر پایه SSH است و توسط ftplib پشتیبانی نمی‌شود.

محدودیت‌ها و جایگزین‌ها

  • ftplib از SFTP پشتیبانی نمی‌کند؛ برای SFTP از Paramiko یا pysftp استفاده کنید.
  • FTP/FTPS ممکن است در برخی شبکه‌ها به خاطر پورت‌های دینامیک مشکل‌ساز شود (خصوصاً حالت Active).
  • برای نیازهای پیچیده مدیریت صف، چندبخشی یا موازی‌سازی انتقال‌ها باید از ابزارها یا پیاده‌سازی‌های اختصاصی استفاده کنید.

جمع‌بندی و نکات کاربردی

ماژول ftplib برای کارهای خودکار و ساده FTP بسیار مناسب است و امکاناتی مثل retrbinary، storbinary، mlsd و FTP_TLS را ارائه می‌دهد. با این حال توجه داشته باشید که امنیت و سازگاری شبکه را بررسی کنید و در صورت نیاز به SFTP از کتابخانه‌های دیگر استفاده نمایید. با رعایت نکات مربوط به اندازه بلاک، حالت passive و استفاده از rest می‌توان انتقال‌های قابل اطمینان و قابل بازیابی نوشت.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: