Python Yardımcı Programları

Bu bölümde, yaygın sorunları çözmek için Python'un birçok standart yardımcı program modülüne bakacağız.

Dosya Sistemi -- os, os.path, closeil

*os* ve *os.path* modülleri, dosya sistemiyle etkileşime giren birçok işlev içerir. *shutil* modülü dosyaları kopyalayabilir.

  • os modülü belgeleri
  • filenames = os.listdir(dir) -- Söz konusu dizin yolundaki dosya adlarının listesi ( . ve ..) kaldırın. Dosya adları, mutlak yolları değil, yalnızca dizindeki adlardır.
  • os.path.join(dir, dosya adı) -- yukarıdaki listeden bir dosya adı verildiğinde, dir ve dosya adını bir araya getirerek yol oluşturmak için bunu kullanın.
  • os.path.abspath(path) -- Bir yol verilir, mutlak bir biçim döndürür, ör. /home/nick/foo/bar.html
  • os.path.dirname(path), os.path.basename(path) -- Verilen dir/foo/bar.html, "dir/foo" dirnamesini döndürün ve basename "bar.html"
  • os.path.exists(path) - (varsa doğru)
  • os.mkdir(dir_path) -- Bir dir oluşturur, os.makedirs(dir_path) yolunu bu yolda gereken tüm dirleri yapar
  • Closeil.copy(source-path, dest-path) -- Bir dosyayı kopyalayın (hedef yolu dizinleri bulunmalıdır)
## 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

Modül keşfetme, yerleşik python help() ve dir() işlevleriyle uyumludur. Çevirmende bir "içe aktar" işlemi yapın ve ardından şu komutları kullanarak modülde neler olduğunu kontrol edin: dir(os), help(os.listdir), dir(os.path), help(os.path.dirname).

Harici İşlemleri Çalıştırma -- alt işlem

*subProcess* modülü, harici komut çalıştırmanın ve sonucunu yakalamanın basit bir yoludur.

  • alt işlem modülü belgeleri
  • çıkış = subprocess.check_Exit(cmd, stderr=subprocess.STDOUT) -- komutu çalıştırır, komutun çıkış yapmasını bekler ve çıkış metnini döndürür. Komut, standart çıkışı ve standart hatanın tek çıkış metninde birleştirilmesiyle çalıştırılır. Başarısız olursa bir CalledProcessError hatası verir.
  • Alt işlemin çalıştırılması üzerinde daha fazla kontrol sahibi olmak istiyorsanız subprocess.popen sınıfına bakın
  • Komutu çalıştıran ve çıkışını çıkışınıza aktaran ve komutun hata kodunu döndüren basit bir subprocess.call(cmd) de vardır. Bu komut, komutu çalıştırmak istiyorsanız ancak komutun çıkışını python veri yapılarınıza yakalamanız gerekmiyorsa işe yarar.
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

İstisnalar

İstisna, belirli bir satırda normal yürütmeyi durduran ve denetimi hata işleme koduna aktaran bir çalışma zamanı hatasını temsil eder. Bu bölümde, istisnaların en temel kullanımları tanıtılmaktadır. Çalışma zamanı hatası, örneğin, programda kullanılan bir değişkenin değer taşımaması (ValueError .. birkaç kere görmüş olabilirsiniz) veya dosya olmaması nedeniyle bir dosya açma işlemi hatası (IOError) olabilir. İstisnalar eğitiminde daha fazla bilgi edinin ve istisna listesinin tamamını inceleyin.

Hata işleme kodu olmadan (şimdiye kadar yaptığımız gibi), çalışma zamanı istisnası yalnızca bir hata mesajıyla programı durdurur. Bu, iyi bir varsayılan davranıştır ve bunu birçok kez görmüştür. Bir "dene/hariç tut" aşağıdaki gibi istisnaları işlemek için kodunuza yapılandırma uygulayın:

  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

Deneme: bölümü, istisnaya neden olabilecek kodu içerir. "Hariç tut" bölümü, bir istisna olması durumunda çalıştırılacak kodu barındırır. İstisna olmazsa şu istisna bölümü atlanır (yani kod yalnızca hata işleme içindir, kodun "normal" durumu için kullanılmaz). "İstisna olarak IOError şu şekilde: .." söz dizimini kullanarak istisna nesnesinin kendisine bir işaretçi alabilirsiniz. (e, istisna nesnesini işaret eder). .

HTTP -- urllib ve urlparse

*urllib.request* modülü, url getirme özelliği sunarak url'nin okuyabileceğiniz bir dosya gibi görünmesini sağlar. *urlparse* modülü, URL'leri ayırıp bir araya getirebilir.

  • urllib.request modül belgeleri
  • ufile = urllib.request.urlopen(url) -- Bu url için nesne gibi bir dosya döndürür
  • text = ufile.read() -- bu dosyadan bir dosya gibi okuyabilir (readlines() vb.)
  • info = ufile.info() -- söz konusu isteğin meta bilgisidir. info.gettype(), mime türüdür, ör. "metin/html"
  • baseurl = ufile.geturl() -- "taban"ı alır istek URL'si; yönlendirmeler nedeniyle orijinalden farklı olabilir
  • urllib.request.urlretrieve(url, dosya adı) -- URL verilerini belirtilen dosya yoluna indirir
  • urllib.parse.urljoin(baseurl, url) -- Tam olabilecek veya olmayabilecek bir URL ve geldiği sayfanın temel URL'si, tam url döndürür. Temel URL'yi sağlamak için yukarıdaki geturl() işlevini kullanın.

Tüm istisnalar urllib.error içindedir.

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)

Yukarıdaki kod sorunsuz çalışıyor ancak bir url herhangi bir nedenle çalışmazsa hata işlemeyi içermez. URL işlemi başarısız olursa hata mesajını yazdırmak için dene/hariç tut mantığını ekleyen fonksiyonun bir sürümünü aşağıda bulabilirsiniz.

urlopen() askıya alınmış gibi görünüyorsa sisteminiz, bazı bilgilere doğrudan erişime izin vermeyebilir http adresleri wget veya aynı URL'yi kullanarak aynı URL'yi getirmeye çalışarak bunu doğrulayabilirsiniz. curl. Bu programlar da başarısız olursa http içeriğini bir proxy aracılığıyla getirmeniz gerekir geliştirmenizi sağlar. Proxy erişimini yapılandırma, bu eğitimde yer almamaktadır.

## 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)

Antrenman

Dosya sistemi ve harici komut dosyalarıyla ilgili alıştırma yapmak için Özel Alıştırmayı Kopyala'yı inceleyin. urllib materyaliyle ilgili alıştırma yapmak için Log Puzzle Alıştırması'na bakın.