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

در این بخش، ما به تعدادی از ماژول‌های کاربردی استاندارد پایتون برای حل مشکلات رایج نگاه می‌کنیم.

سیستم فایل -- os, os.path, shutil

ماژول های *os* و *os.path* دارای توابع زیادی برای تعامل با سیستم فایل هستند. ماژول *shutil* می تواند فایل ها را کپی کند.

  • اسناد ماژول OS
  • filenames = os.listdir(dir) -- لیستی از نام فایل ها در آن مسیر دایرکتوری (غیر از . و ..). نام فایل ها فقط نام های موجود در فهرست هستند، نه مسیرهای مطلق آنها.
  • os.path.join(dir, filename) -- با دادن نام فایل از لیست بالا، از این برای قرار دادن dir و نام فایل با هم برای ایجاد یک مسیر استفاده کنید.
  • os.path.abspath(path) -- یک مسیر داده می شود، یک شکل مطلق برمی گرداند، به عنوان مثال /home/nick/foo/bar.html
  • os.path.dirname(path)، os.path.basename(path) -- dir/foo/bar.html داده شده، نام dir/foo و نام پایه "bar.html" را برگردانید.
  • os.path.exists(path) -- اگر وجود داشته باشد درست است
  • os.mkdir(dir_path) -- یک dir می سازد، os.makedirs(dir_path) همه dirs های مورد نیاز در این مسیر را می سازد.
  • shutil.copy (مسیر منبع، مسیر مقصد) -- یک فایل را کپی کنید (دایرکتوری های مسیر اصلی باید وجود داشته باشند)
## Example pulls filenames from a dir, prints their relative and absolute paths
def printdir(dir):
  filenames = os.listdir(dir)
  for filename in filenames:
    print(filename)  ## foo.txt
    print(os.path.join(dir, filename)) ## dir/foo.txt (relative to current dir)
    print(os.path.abspath(os.path.join(dir, filename))) ## /home/nick/dir/foo.txt

کاوش یک ماژول با توابع کمک () و dir () پایتون به خوبی کار می کند. در مفسر، "وارد کردن سیستم عامل" را انجام دهید و سپس از این دستورات استفاده کنید و به آنچه در ماژول موجود است نگاه کنید: dir(os)، help(os.listdir)، dir(os.path)، help(os.path.dirname ).

اجرای فرآیندهای خارجی -- فرآیند فرعی

ماژول *subprocess* یک راه ساده برای اجرای یک فرمان خارجی و گرفتن خروجی آن است.

  • اسناد ماژول فرعی
  • output = subprocess.check_output (cmd, stderr=subprocess.STDOUT) -- دستور را اجرا می کند، منتظر می ماند تا خارج شود و متن خروجی آن را برمی گرداند. دستور با خروجی استاندارد و خطای استاندارد در یک متن خروجی اجرا می شود. اگر ناموفق باشد، یک CalledProcessError می اندازد.
  • اگر می‌خواهید کنترل بیشتری بر اجرای فرآیند فرعی داشته باشید، به کلاس subprocess.popen مراجعه کنید
  • همچنین یک subprocess.call(cmd) ساده وجود دارد که دستور را اجرا می‌کند و خروجی آن را روی خروجی شما می‌ریزد و کد خطا را برمی‌گرداند. اگر بخواهید دستور را اجرا کنید اما نیازی به گرفتن خروجی آن در ساختارهای داده پایتون خود ندارید، این کار کار می کند.
import subprocess

## Given a dir path, run an external 'ls -l' on it --
## shows how to call an external program
def listdir(dir):
  cmd = 'ls -l ' + dir
  print("Command to run:", cmd)   ## good to debug cmd before actually running it
  (status, output) = subprocess.getstatusoutput(cmd)
  if status:    ## Error case, print the command's output to stderr and exit
    sys.stderr.write(output)
    sys.exit(status)
  print(output)  ## Otherwise do something with the command's output

استثنائات

یک استثنا نشان دهنده یک خطای زمان اجرا است که اجرای عادی را در یک خط خاص متوقف می کند و کنترل را به کد مدیریت خطا منتقل می کند. این بخش فقط ابتدایی ترین کاربردهای استثناها را معرفی می کند. به عنوان مثال، یک خطای زمان اجرا ممکن است این باشد که متغیری که در برنامه استفاده می‌شود مقداری نداشته باشد (ValueError .. احتمالاً چند بار آن را دیده‌اید)، یا خطای عملیات باز کردن فایل به دلیل وجود نداشتن فایل ( خطای IO). در آموزش استثناها بیشتر بیاموزید و کل لیست استثناها را ببینید.

بدون هیچ کد رسیدگی به خطا (همانطور که تاکنون انجام داده ایم)، یک استثنا در زمان اجرا فقط برنامه را با یک پیام خطا متوقف می کند. این یک رفتار پیش فرض خوب است و شما آن را بارها دیده اید. می توانید یک ساختار "try/except" به کد خود اضافه کنید تا استثنائات را مدیریت کنید، مانند این:

  try:
    ## Either of these two lines could throw an IOError, say
    ## if the file does not exist or the read() encounters a low level error.
    f = open(filename, 'rb')
    data = f.read()
    f.close()
  except IOError:
    ## Control jumps directly to here if any of the above lines throws IOError.
    sys.stderr.write('problem reading:' + filename)
  ## In any case, the code then continues with the line after the try/except

بخش try: شامل کدی است که ممکن است یک استثنا ایجاد کند. بخش جز: کد را نگه می دارد تا در صورت وجود استثنا اجرا شود. اگر هیچ استثنایی وجود نداشته باشد، بخش بجز: حذف می شود (یعنی این کد فقط برای رسیدگی به خطا است، نه حالت "عادی" برای کد). شما می توانید یک اشاره گر به خود شی استثناء با دستور "به جز IOError به عنوان e: .." دریافت کنید (e به شی استثنا اشاره می کند).

HTTP -- urllib و urlparse

ماژول *urllib.request* واکشی url را فراهم می کند -- نشانی اینترنتی را شبیه فایلی می کند که می توانید از آن بخوانید. ماژول *urlparse* می تواند url ها را جدا کرده و کنار هم قرار دهد.

  • اسناد ماژول urllib.request
  • ufile = urllib.request.urlopen(url) -- فایلی مانند شی را برای آن url برمی گرداند
  • text = ufile.read() -- می تواند از روی آن بخواند، مانند یک فایل (readlines() و غیره نیز کار می کند)
  • info = ufile.info() -- اطلاعات متا برای آن درخواست. info.gettype() نوع mime است، به عنوان مثال "text/html"
  • baseurl = ufile.geturl() -- URL "پایه" را برای درخواست دریافت می کند، که ممکن است به دلیل تغییر مسیرها با اصلی متفاوت باشد.
  • urllib.request.urlretrieve(url، نام فایل) -- داده های url را در مسیر فایل داده شده دانلود می کند
  • urllib.parse.urljoin(baseurl، url) -- با توجه به آدرس اینترنتی که ممکن است پر باشد یا نباشد، و پایه صفحه ای که از آن آمده است، یک URL کامل را برمی گرداند. از geturl() بالا برای ارائه url پایه استفاده کنید.

همه استثناها در urllib.error هستند.

from urllib.request import urlopen

## Given a url, try to retrieve it. If it's text/html,
## print its base url and its text.
def wget(url):
  ufile = urlopen(url)  ## get file-like object for url
  info = ufile.info()   ## meta-info about the url content
  if info.get_content_type() == 'text/html':
    print('base url:' + ufile.geturl())
    text = ufile.read()  ## read all its text
    print(text)

کد بالا به خوبی کار می کند، اما اگر URL به دلایلی کار نکند، شامل رسیدگی به خطا نمی شود. در اینجا نسخه‌ای از تابع وجود دارد که منطق try/except را برای چاپ پیام خطا در صورت شکست عملیات URL اضافه می‌کند.

اگر به نظر می رسد urlopen() هنگ کرده است، ممکن است سیستم شما اجازه دسترسی مستقیم به برخی از آدرس های http را ندهد. می‌توانید این را با تلاش برای واکشی نشانی اینترنتی مشابه با استفاده از wget یا curl تأیید کنید. اگر این برنامه ها نیز با شکست مواجه شوند، باید محتوای http را از طریق یک سرویس پروکسی واکشی کنید. پیکربندی دسترسی پروکسی تحت پوشش این آموزش نیست.

## Version that uses try/except to print an error message if the
## urlopen() fails.
def wget2(url):
  try:
    ufile = urlopen(url)
    if ufile.info().get_content_type() == 'text/html':
      print(ufile.read())
  except IOError:
    print('problem reading url:', url)

ورزش کنید

برای تمرین سیستم فایل و مواد دستورات خارجی، تمرین ویژه کپی را ببینید. برای تمرین مواد urllib، تمرین پازل ورود به سیستم را ببینید.