Python 유틸리티

이 섹션에서는 일반적인 문제를 해결하기 위해 Python의 다양한 표준 유틸리티 모듈 몇 가지를 살펴봅니다.

파일 시스템 -- os, os.path, exitil

*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이 주어지면 dirname 'dir/foo'를 반환합니다. 기본 이름은 'bar.html'입니다.
  • os.path.exists(path) -- 존재하는 경우 true
  • os.mkdir(dir_path) -- 하나의 dir을 만들고 os.makedirs(dir_path)는 이 경로에 필요한 모든 dir을 만듭니다.
  • Shutil.copy(source-path, dest-path) -- 파일을 복사합니다 (도착 경로 디렉터리가 있어야 함).
## 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

모듈 탐색은 내장된 Python help() 및 dir() 함수를 통해 원활하게 작동합니다. 인터프리터에서 'import os'를 실행한 다음 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)도 있습니다. 이는 명령어를 실행하려고 하지만 출력을 Python 데이터 구조로 캡처할 필요는 없는 경우에 사용할 수 있습니다.
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 .. 여러 번 본 적이 있을 수 있음) 파일이 존재하지 않아 파일 열기 작업 오류 (IOError)가 발생하는 경우 런타임 오류가 발생할 수 있습니다. 예외 튜토리얼에서 자세히 알아보고 전체 예외 목록을 참조하세요.

지금까지 한 것처럼 오류 처리 코드가 없으면 런타임 예외로 인해 오류 메시지와 함께 프로그램이 중단됩니다. 이는 좋은 기본 동작이며 여러 번 봤습니다. '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 as e: ..를 제외' 문법으로 예외 객체 자체에 대한 포인터를 가져올 수 있습니다. e는 예외 객체를 가리킵니다.

HTTP -- urllib 및 urlparse

*urllib.request* 모듈은 URL 가져오기를 제공하여, URL을 읽을 수 있는 파일처럼 보이게 합니다. *urlparse* 모듈은 URL을 분해하여 조합할 수 있습니다.

  • urllib.request 모듈 문서
  • ufile = urllib.request.urlopen(url) -- 해당 URL에 대해 객체와 같은 파일을 반환합니다.
  • text = ufile.read() -- 파일처럼 읽을 수 있습니다 (readlines() 등도 작동함).
  • info = ufile.info() -- 해당 요청의 메타 정보입니다. info.gettype()은 MIME 유형입니다. 예: '텍스트/html'
  • baseurl = ufile.geturl() -- 'base'를 가져옵니다. 리디렉션으로 인해 원본과 다를 수 있는 요청 URL입니다.
  • urllib.request.urlretrieve(url, filename) -- URL 데이터를 지정된 파일 경로로 다운로드합니다.
  • urllib.parse.urljoin(baseurl, url) -- 가득 차거나 꽉 찼을 수 있는 URL과 이 URL이 발생한 페이지의 기본 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이 작동하지 않는 경우 오류 처리를 포함하지 않습니다. 다음은 URL 작업이 실패할 경우 오류 메시지를 출력하는 try/except 로직을 추가하는 함수 버전입니다.

urlopen()이(가) 대기 중인 것으로 보이는 경우, 시스템이 일부 제품에 대한 직접 액세스를 허용하지 않을 수 있습니다 http 주소 wget를 사용하여 동일한 URL을 가져와서 확인할 수 있습니다. 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 자료를 연습하려면 퍼즐 실습 기록을 참조하세요.