Utilitas Python

Di 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
  • namafiles = os.listdir(dir) -- daftar nama {i>file<i} dalam jalur direktori itu (tidak termasuk . dan ..). Nama file hanyalah nama dalam direktori, bukan jalur absolutnya.
  • os.path.join(dir, username) -- diberi nama file dari daftar di atas, gunakan ini untuk menggabungkan dir dan nama file untuk membuat jalur
  • os.path.abspath(path) -- jika diberi jalur, tampilkan bentuk absolut, mis. /home/nick/foo/bar.html
  • os.path.dirname(path), os.path.basename(path) -- dengan dir/foo/bar.html, tampilkan dirname "dir/foo" dan basename "bar.html"
  • os.path.exists(path) -- benar jika ada
  • os.mkdir(dir_path) -- membuat satu dir, os.makedirs(dir_path) membuat semua dir yang dibutuhkan di jalur ini
  • shutil.copy(source-path, dest-path) -- salin 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 berfungsi dengan baik dengan fungsi help() dan dir() bawaan python. Dalam penafsir, lakukan "import os", lalu gunakan perintah ini untuk melihat apa yang tersedia di modul: dir(os), help(os.listdir), dir(os.path), help(os.path.dirname).

Menjalankan Proses Eksternal -- subproses

Modul *subproses* adalah cara sederhana untuk menjalankan perintah eksternal dan merekam output-nya.

  • dokumen modul subproses
  • output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) -- menjalankan perintah, menunggunya keluar, dan mengembalikan teks {i>outputnya<i}. Perintah dijalankan dengan output standar dan error standar yang digabungkan menjadi satu teks output. Jika gagal, panggilan akan menampilkan DipanggilProcessError.
  • Jika Anda ingin lebih mengontrol jalannya subproses, lihat class subprocess.popen
  • Ada juga subprocess.call(cmd) sederhana yang menjalankan perintah dan mengeluarkan outputnya ke output Anda, lalu 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} adalah bahwa variabel yang digunakan dalam program tidak memiliki nilai (ValueError .. Anda mungkin pernah melihatnya beberapa kali), atau kesalahan operasi membuka file karena file tidak ada (IOError). Pelajari lebih lanjut di tutorial pengecualian dan lihat seluruh daftar pengecualian.

Tanpa kode penanganan error (seperti yang telah kita lakukan sejauh ini), pengecualian runtime hanya menghentikan program dengan pesan error. Itu perilaku {i>default<i} yang baik, dan Anda telah melihatnya berkali-kali. Anda dapat menambahkan "coba/kecuali" 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: berisi kode yang mungkin menampilkan pengecualian. Bagian kecuali: menyimpan kode yang akan dijalankan jika ada pengecualian. Jika tidak ada pengecualian, bagian kecuali: akan dilewati (yaitu, kode tersebut hanya untuk penanganan error, bukan kasus "normal" untuk kode). Anda bisa mendapatkan 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 membongkar dan menyatukan URL.

  • dokumen modul urllib.request
  • ufile = urllib.request.urlopen(url) -- mengembalikan file seperti objek untuk url tersebut
  • text = ufile.read() - dapat membaca darinya, seperti file (readlines() dll. juga berfungsi)
  • info = ufile.info() -- info meta untuk permintaan itu. info.gettype() adalah jenis MIME, misalnya 'teks/html'
  • baseurl = ufile.geturl() -- mendapatkan "base" URL untuk permintaan, yang mungkin berbeda dari aslinya karena pengalihan
  • urllib.request.url mengambil(url, nama file) -- mengunduh data url ke jalur file yang diberikan
  • urllib.parse.urljoin(baseurl, url) -- dengan url yang mungkin penuh atau tidak penuh, dan baseurl halaman asal, 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 termasuk penanganan error jika URL tidak berfungsi karena alasan tertentu. Berikut adalah versi fungsi yang menambahkan logika coba/pengecualian untuk mencetak pesan error jika operasi URL gagal.

Jika urlopen() tampak mengalami hang, sistem Anda mungkin tidak mengizinkan akses langsung ke beberapa alamat http. Anda dapat memverifikasi hal ini dengan mencoba mengambil URL yang sama menggunakan wget atau curl. Jika program ini juga gagal, Anda harus mengambil konten http melalui proxy layanan. 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.