10.1. 운영 체제 인터페이스
이 os모듈은 운영 체제와 상호 작용하기 위한 많은 기능을 제공합니다.
import os
print(os.getcwd()) # Return the current working directory
os.chdir('/server/accesslogs') # Change current working directory
os.system('mkdir today') # Run the command mkdir in the system shell
내장 dir()및 help()함수는 os다음 과 같은 대형 모듈 작업을 위한 대화형 보조 도구로 유용합니다 .
import os
dir(os)
help(os)
일상적인 파일 및 디렉토리 관리 작업을 위해 shutil모듈은 사용하기 쉬운 상위 수준 인터페이스를 제공합니다.
import shutil
shutil.copyfile('data.db', 'archive.db')
'archive.db'
shutil.move('/build/executables', 'installdir')
'installdir'
10.2. 파일 와일드카드
glob모듈은 디렉토리 와일드 카드 검색에서 파일 목록을 만들기위한 기능을 제공합니다 :
import glob
glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
10.3. 명령줄 인수
공통 유틸리티 스크립트는 종종 명령줄 인수를 처리해야 합니다. 이러한 인수는 sys모듈의 argv 속성에 목록으로 저장됩니다 . 예를 들어 다음 출력 은 명령줄 에서 실행한 결과입니다. python demo.py one two three
import sys
print(sys.argv)
['demo.py', 'one', 'two', 'three']
이 argparse모듈은 명령줄 인수를 처리하는 보다 정교한 메커니즘을 제공합니다. 다음 스크립트는 하나 이상의 파일 이름과 표시할 줄 수(선택 사항)를 추출합니다.
import argparse
parser = argparse.ArgumentParser(prog = 'top',
description = 'Show top lines from each file')
parser.add_argument('filenames', nargs='+')
parser.add_argument('-l', '--lines', type=int, default=10)
args = parser.parse_args()
print(args)
를 사용하여 명령줄에서 실행 하면 스크립트는 python top.py --lines=5 alpha.txt beta.txtargs.lines5args.filenames['alpha.txt', 'beta.txt']로 설정 됩니다.
10.4. 오류 출력 리디렉션 및 프로그램 종료
sys모듈은 표준 입력 , 표준 출력 및 표준 오류를 출력합니다. 후자는 stdout 이 리디렉션된 경우에도 표시되도록 경고 및 오류 메시지를 내보내는 데 유용합니다 .
sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one
스크립트를 종료하는 가장 직접적인 방법은 를 사용하는 것 sys.exit()입니다.
10.5. 문자열 패턴 일치
re모듈은 고급 문자열 처리를 위해 정규 표현식 도구를 제공합니다. 복잡한 일치 및 조작을 위해 정규식은 간결하고 최적화된 솔루션을 제공합니다.
>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'
단순한 기능만 필요한 경우 문자열 메서드가 더 읽기 쉽고 디버그하기 쉽기 때문에 선호됩니다.
>>> 'tea for too'.replace('too', 'two')
'tea for two'
10.6. 수학
이 math모듈은 부동 소수점 수학을 위한 기본 C 라이브러리 함수에 대한 액세스를 제공합니다.
>>> import math
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> math.log(1024, 2)
10.0
이 random모듈은 무작위 선택을 위한 도구를 제공합니다.
>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10) # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random() # random float
0.17970987693706186
>>> random.randrange(6) # random integer chosen from range(6)
4
statistics모듈 기초 통계 속성 수치 데이터 (평균, 중앙값, 분산, 등)를 계산한다 :
>>> import statistics
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> statistics.mean(data)
1.6071428571428572
>>> statistics.median(data)
1.25
>>> statistics.variance(data)
1.3720238095238095
SciPy 프로젝트< https://scipy.org >에는 수치 계산을 위한 다른 많은 모듈이 있습니다.
10.7. 인터넷 액세스
인터넷에 액세스하고 인터넷 프로토콜을 처리하기 위한 여러 모듈이 있습니다. 가장 간단한 두 가지는 urllib.requestURL에서 데이터를 검색하고 smtplib메일을 보내는 것입니다.
>>> from urllib.request import urlopen
>>> with urlopen('http://worldtimeapi.org/api/timezone/etc/UTC.txt') as response:
... for line in response:
... line = line.decode() # Convert bytes to a str
... if line.startswith('datetime'):
... print(line.rstrip()) # Remove trailing newline
...
datetime: 2022-01-01T01:36:47.689215+00:00
>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
... """To: jcaesar@example.org
... From: soothsayer@example.org
...
... Beware the Ides of March.
... """)
>>> server.quit()
(두 번째 예에서는 localhost에서 실행되는 메일 서버가 필요합니다.)
10.8. 날짜 및 시간
datetime간단하고 복잡한 방법 모두에서 날짜와 시간을 조작하기위한 모듈 공급 클래스. 날짜 및 시간 산술이 지원되지만 구현의 초점은 출력 형식 지정 및 조작을 위한 효율적인 멤버 추출에 있습니다. 이 모듈은 시간대를 인식하는 객체도 지원합니다.
>>> # dates are easily constructed and formatted
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'
>>> # dates support calendar arithmetic
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368
10.9. 데이터 압축
: 공통 데이터 보관 및 압축 포맷으로 직접 포함 모듈에 의해 지원되는 zlib, gzip, bz2, lzma, zipfile및 tarfile.
>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979
10.10. 성능 측정
일부 Python 사용자는 동일한 문제에 대한 다양한 접근 방식의 상대적인 성능을 아는 데 깊은 관심을 보입니다. Python은 이러한 질문에 즉시 답변하는 측정 도구를 제공합니다.
예를 들어, 인수를 교환하는 전통적인 접근 방식 대신 튜플 패킹 및 언패킹 기능을 사용하고 싶을 수 있습니다. timeit 모듈은 빠르게 겸손한 성능 이점을 보여줍니다
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
timeit의 세밀한 수준과 달리 profile및 pstats모듈은 더 큰 코드 블록에서 시간이 중요한 섹션을 식별하기 위한 도구를 제공합니다.
10.11. 품질 관리
고품질 소프트웨어를 개발하기 위한 한 가지 접근 방식은 개발될 때 각 기능에 대한 테스트를 작성하고 개발 프로세스 중에 이러한 테스트를 자주 실행하는 것입니다.
이 doctest모듈은 모듈을 스캔하고 프로그램의 독스트링에 포함된 테스트를 검증하기 위한 도구를 제공합니다. 테스트 구성은 결과와 함께 일반적인 호출을 잘라내어 독스트링에 붙여넣는 것처럼 간단합니다. 이렇게 하면 사용자에게 예제를 제공하여 문서를 개선하고 doctest 모듈이 코드가 문서와 일치하는지 확인할 수 있습니다.
def average(values):
"""Computes the arithmetic mean of a list of numbers.
>>> print(average([20, 30, 70]))
40.0
"""
return sum(values) / len(values)
import doctest
doctest.testmod() # automatically validate the embedded tests
unittest모듈은 같은 노력으로하지 doctest모듈 만 별도의 파일에서 유지되는 테스트의보다 포괄적 인 세트를 할 수 있습니다 :
import unittest
class TestStatisticalFunctions(unittest.TestCase):
def test_average(self):
self.assertEqual(average([20, 30, 70]), 40.0)
self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
with self.assertRaises(ZeroDivisionError):
average([])
with self.assertRaises(TypeError):
average(20, 30, 70)
unittest.main() # Calling from the command line invokes all tests
10.12. 포함된 배터리
Python에는 "배터리 포함" 철학이 있습니다. 이는 더 큰 패키지의 정교하고 강력한 기능을 통해 가장 잘 알 수 있습니다. 예를 들어:
- xmlrpc.client및 xmlrpc.server모듈은 거의 사소한 작업에 원격 프로 시저 호출을 구현합니다. 모듈 이름에도 불구하고 XML에 대한 직접적인 지식이나 처리가 필요하지 않습니다.
- email패키지는 MIME 및 기타를 포함하는 이메일 메시지를 관리하기위한 라이브러리입니다RFC 2822 기반 메시지 문서. 달리smtplib하고 poplib있는 실제로 메시지를 보내고, 이메일 패키지를 구축하거나 (첨부 파일 포함) 복잡한 메시지 구조를 디코딩 및 인터넷 인코딩과 헤더 프로토콜을 구현하기위한 완벽한 도구 세트가 있습니다.
- 이 json패키지는 널리 사용되는 데이터 교환 형식의 구문 분석을 위한 강력한 지원을 제공합니다. 이 csv모듈은 일반적으로 데이터베이스와 스프레드시트에서 지원되는 쉼표로 구분된 값 형식의 파일을 직접 읽고 쓸 수 있도록 지원합니다. XML 처리는 xml.etree.ElementTree, xml.dom및 xml.sax패키지 에서 지원됩니다 . 함께 이러한 모듈과 패키지는 Python 응용 프로그램과 다른 도구 간의 데이터 교환을 크게 단순화합니다.
- 이 sqlite3모듈은 약간 비표준적인 SQL 구문을 사용하여 업데이트하고 액세스할 수 있는 영구 데이터베이스를 제공하는 SQLite 데이터베이스 라이브러리의 래퍼입니다.
- 국제화를 포함한 모듈의 숫자에 의해 지원 gettext, locale그리고 codecs패키지로 제공된다.