Python Yardımcı Programları

Bu bölümde, yaygın sorunları çözmek için Python'un çok sayıda standart yardımcı program modülünden birkaçına göz atacağız.

Dosya Sistemi -- os, os.path, closeil

*os* ve *os.path* modülleri, dosya sistemiyle etkileşimde bulunabileceğiniz 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 ..). Dosya adları mutlak yolları değil, yalnızca dizindeki adlardır.
  • os.path.join(dir, dosya adı) -- yukarıdaki listede yer alan bir dosya adı verildiğinde, bir yol oluşturmak üzere dir ve dosya adını bir araya getirmek için bunu kullanın
  • os.path.abspath(path) - Bir yol belirtildiğinde, 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" dirname ve "bar.html" temel adını döndürür
  • os.path.exists(path) -- varsa true
  • os.mkdir(dir_path) -- bir dir oluşturur, os.makedirs(dir_path) bu yoldaki gerekli tüm dir'leri oluşturur
  • CLOSEil.copy(kaynak-yolu, hedef-yolu) -- bir dosya kopyalayın (hedef yolu dizinleri mevcut olmalı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

Bir modülü keşfetmek, yerleşik python help() ve dir() işlevleriyle birlikte kullanıldığında işe yarar. Çevirmende bir "import os" işlemi yapın ve ardından şu komutları kullanarak modülde neler olduğuna bakın: dir(os), help(os.listdir), dir(os.path), help(os.path.dirname).

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

*Alt işlem* modülü, harici bir komut çalıştırmanın ve çıkışını yakalamanın basit bir yoludur.

  • alt işlem modülü belgeleri
  • exit = subprocess.check_output(cmd, stderr=subprocess.STDOUT) - komutu çalıştırır, komutun çıkmasını bekler ve çıkış metnini döndürür. Komut, standart çıkışı ve standart hatasıyla birlikte tek bir çıktı metniyle çalıştırılır. Başarısız olursa bir CalledProcessError bildirir.
  • Alt işlemin çalışması üzerinde daha fazla kontrol istiyorsanız subprocess.popen sınıfına bakın
  • Komutu çalıştıran ve komutun çıktısını çıkışınıza aktaran ve hata kodunu döndüren basit bir subprocess.call(cmd) da vardır. Komutu çalıştırmak istiyor ancak komutun çıktısını python veri yapılarınıza yakalamanız gerekmiyorsa bu yöntem 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 kontrolü hata işleme koduna aktaran bir çalışma zamanı hatasını temsil eder. Bu bölümde istisnaların en temel kullanımları açıklanmaktadır. Örneğin bir çalışma zamanı hatası, programda kullanılan bir değişkenin bir değere sahip olmaması (ValueError .. bunu birkaç kez görmüş olabilirsiniz) veya bir dosya olmadığı için bir dosya açma işlemi hatası (IOError) olabilir. İstisnalar eğitiminde daha fazla bilgi edinin ve istisna listesinin tamamını inceleyin.

Herhangi bir hata işleme kodu olmadan (şimdiye kadar yaptığımız gibi), çalışma zamanı istisnası, programı bir hata mesajıyla durdurur. Bu, iyi bir varsayılan davranıştır ve birçok kez görmüşsünüzdür. İstisnaları işlemek için kodunuza bir "dene/hariç" yapısı ekleyebilirsiniz. Örneğin:

  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ç: bölümü, bir istisna olması durumunda çalıştırılacak kodu içerir. İstisna yoksa hariç: bölümü atlanır (yani bu kod, kodun "normal" durumu değil, yalnızca hata işleme amaçlıdır). "IOError şu şekilde e: .." (e, istisna nesnesini işaret eder) söz dizimiyle istisna nesnesinin kendisine bir işaretçi alabilirsiniz.

HTTP -- urllib ve urlparse

*urllib.request* modülü, url getirme özelliği sağlar. Böylece url'yi, okuyabileceğiniz bir dosyaya benzer hale getirir. *urlparse* modülü, URL'leri parçalara ayırabilir ve 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() -- bir dosya gibi (readlines() vb. bu dosyadan okunabilir)
  • info = ufile.info() -- Söz konusu isteğin meta bilgisi. info.gettype() mime türüdür, ör. "metin/html"
  • baseurl = ufile.geturl() -- isteğin "base" URL'sini alır. Bu, yönlendirmeler nedeniyle orijinal URL'den farklı olabilir.
  • urllib.request.urlretrieve(url, dosya adı) -- url verilerini belirtilen dosya yoluna indirir
  • urllib.parse.urljoin(baseurl, url) -- dolu olabilecek veya olmayan bir url ve geldiği sayfanın temel URL'si belirtildiğinde 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ışır, ancak url'nin bir nedenle çalışmaması durumunda hata işlemeyi içermez. URL işlemi başarısız olursa hata mesajı yazdırmak için dene/hariç mantığını ekleyen işlevin bir sürümünü burada bulabilirsiniz.

urlopen() askıya alınmış gibi görünüyorsa sisteminiz bazı http adreslerine doğrudan erişime izin vermeyebilir. Bunu, wget veya curl ile aynı URL'yi getirmeye çalışarak doğrulayabilirsiniz. Bu programlar da başarısız olursa http içeriğini bir proxy hizmeti üzerinden getirmeniz gerekir. Proxy erişiminin yapılandırılması bu eğitimde ele alınmamıştı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)

Tatbikat

Dosya sistemi ve harici komutlarla ilgili alıştırma yapmak için Özel Alıştırmayı Kopyalama'ya bakın. urllib materyaliyle ilgili alıştırma yapmak için Log Puzzle Alıştırması'nı inceleyin.