이 섹션에서는 일반적인 문제를 해결하기 위해 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 자료를 연습하려면 퍼즐 실습 기록을 참조하세요.