Utilitas Python

Pada bagian ini, kita melihat beberapa modul utilitas standar Python untuk memecahkan masalah umum.

Sistem File -- os, os.path, shutil

Modul *os* dan *os.path* mencakup banyak fungsi untuk berinteraksi dengan sistem file. Modul *shutil* dapat menyalin file.

  • dokumen modul os
  • namafile = os.listdir(dir) -- daftar nama file dalam jalur direktori itu (tidak termasuk . dan ..). Nama file hanyalah nama dalam direktori, bukan jalur absolutnya.
  • os.path.join(dir, nama file) -- diberi nama file dari daftar di atas, gunakan ini untuk menempatkan dir dan nama file bersama-sama untuk membuat jalur
  • os.path.abspath(path) -- jika diberi jalur, menampilkan bentuk absolut, misalnya /home/nick/foo/bar.html
  • os.path.dirname(path), os.path.basename(path) -- jika diberi dir/foo/bar.html, tampilkan dirname "dir/foo" dan nama dasar "bar.html"
  • os.path.exists(path) -- true jika ada
  • os.mkdir(dir_path) -- membuat satu dir, os.makedirs(dir_path) membuat semua dirs yang diperlukan di jalur ini
  • shutil.copy(source-path, dest-path) -- menyalin file (direktori jalur tujuan harus ada)
## 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

Mempelajari modul akan berfungsi dengan baik dengan fungsi help() dan dir() python bawaan. Dalam penafsir, lakukan "impor os", lalu gunakan perintah ini untuk melihat apa yang tersedia dalam modul: dir(os), help(os.listdir), dir(os.path), help(os.path.dirname).

Menjalankan Proses Eksternal -- subproses

Modul *subprocess* adalah cara sederhana untuk menjalankan perintah eksternal dan merekam outputnya.

  • dokumen modul subproses
  • output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) -- menjalankan perintah, menunggunya keluar, dan mengembalikan teks outputnya. Perintah dijalankan dengan {i>output<i} standar dan {i>standard error<i} digabungkan ke dalam satu teks output. Jika gagal, metode ini akan menampilkan Berpanggilan ProcessError.
  • Jika Anda menginginkan kontrol lebih besar terhadap jalannya sub-proses, lihat class subprocess.popen
  • Ada juga subprocess.call(cmd) sederhana yang menjalankan perintah dan mengeluarkan output-nya ke output Anda dan menampilkan kode error-nya. Ini berfungsi jika Anda ingin menjalankan perintah tetapi tidak perlu menangkap outputnya ke dalam struktur data python Anda.
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

Pengecualian

Pengecualian mewakili error runtime yang menghentikan eksekusi normal pada baris tertentu dan mentransfer kontrol ke kode penanganan error. Bagian ini hanya memperkenalkan penggunaan pengecualian yang paling dasar. Misalnya, kesalahan {i>run-time <i}mungkin berupa variabel yang digunakan dalam program tidak memiliki nilai (ValueError .. Anda mungkin pernah melihatnya beberapa kali), atau kesalahan operasi file terbuka karena file tidak ada (IOError). Pelajari lebih lanjut di tutorial pengecualian, lalu lihat seluruh daftar pengecualian.

Tanpa kode penanganan error (seperti yang telah kita lakukan sejauh ini), pengecualian runtime hanya akan menghentikan program dengan pesan error. Itu adalah perilaku default yang baik, dan Anda telah melihatnya berkali-kali. Anda dapat menambahkan struktur "coba/kecuali" ke kode Anda untuk menangani pengecualian, seperti ini:

  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

Bagian try: mencakup kode yang mungkin menampilkan pengecualian. Bagian exception: menyimpan kode yang akan dijalankan jika ada pengecualian. Jika tidak ada pengecualian, bagian exception: dilewati (yaitu, kode tersebut hanya untuk penanganan error, bukan kasus "normal" untuk kode). Anda dapat memperoleh pointer ke objek pengecualian itu sendiri dengan sintaksis "kecuali IOError as e: .." (e menunjuk ke objek pengecualian).

HTTP -- urllib dan urlparse

Modul *urllib.request* menyediakan pengambilan url -- membuat URL terlihat seperti file yang dapat Anda baca. Modul *urlparse* dapat membuka dan menyatukan URL.

  • dokumen modul urllib.request
  • ufile = urllib.request.urlopen(url) -- mengembalikan file sejenis objek untuk url tersebut
  • text = ufile.read() -- dapat membaca darinya, seperti file (readlines() dll. juga berfungsi)
  • info = ufile.info() -- info meta untuk permintaan tersebut. info.gettype() adalah jenis mime, misalnya 'text/html'
  • baseurl = ufile.geturl() -- mendapatkan url "base" untuk permintaan tersebut, yang mungkin berbeda dengan aslinya karena pengalihan
  • urllib.request.urlfetch(url, nama file) -- mengunduh data URL ke jalur file yang ditentukan
  • urllib.parse.urljoin(baseurl, url) -- jika Anda memiliki url yang mungkin penuh atau tidak, dan baseurl halaman asalnya, akan menampilkan URL lengkap. Gunakan geturl() di atas untuk memberikan URL dasar.

Semua pengecualian ada di 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)

Kode di atas berfungsi dengan baik, tetapi tidak menyertakan penanganan error jika URL tidak berfungsi karena alasan tertentu. Berikut adalah versi fungsi yang menambahkan logika coba/kecuali untuk mencetak pesan error jika operasi URL gagal.

Jika urlopen() tampaknya hang, sistem Anda mungkin tidak mengizinkan akses langsung ke beberapa alamat http. Anda dapat memverifikasinya dengan mencoba mengambil URL yang sama menggunakan wget atau curl. Jika program tersebut juga gagal, Anda harus mengambil konten http melalui layanan proxy. Mengonfigurasi akses proxy tidak dibahas dalam tutorial ini.

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

Latihan

Untuk mempraktikkan sistem file dan materi perintah eksternal, lihat Menyalin Latihan Khusus. Untuk mempraktikkan materi urllib, lihat Latihan Puzzle Log.