Skip to content

Python 学习笔记 10. 标准库简介

🏷️ Python Python 学习笔记

10.1. 操作系统接口

os 模块提供了许多与操作系统交互的函数:

python
>>> import os
>>> os.getcwd()
'C:\\Users\\liujiajia'
>>> os.chdir('D:\\')
>>> os.system('mkdir today')
0
>>> os.getcwd()
'D:\\'
>>> os.chdir('today')
>>> os.getcwd()
'D:\\today'

内置的 dir()help() 函数可用作交互式辅助工具,用于处理大型模块,如 os:

python
>>> import os
>>> dir(os)
['DirEntry', 'F_OK', 'MutableMapping', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXC
L', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LI
VED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P
_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'PathLike', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'S
EEK_SET', 'TMP_MAX', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__c
ached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spe
c__', '_execvpe', '_exists', '_exit', '_fspath', '_get_exports_list', '_putenv',
 '_unsetenv', '_wrap_close', 'abc', 'abort', 'access', 'altsep', 'chdir', 'chmod
', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath', 'device_encoding', '
devnull', 'dup', 'dup2', 'environ', 'error', 'execl', 'execle', 'execlp', 'execl
pe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fdopen', 'fsdecode', 'fs
encode', 'fspath', 'fstat', 'fsync', 'ftruncate', 'get_exec_path', 'get_handle_i
nheritable', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'geten
v', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'linesep', 'link', 'listd
ir', 'lseek', 'lstat', 'makedirs', 'mkdir', 'name', 'open', 'pardir', 'path', 'p
athsep', 'pipe', 'popen', 'putenv', 'read', 'readlink', 'remove', 'removedirs',
'rename', 'renames', 'replace', 'rmdir', 'scandir', 'sep', 'set_handle_inheritab
le', 'set_inheritable', 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'st', 'startfi
le', 'stat', 'stat_result', 'statvfs_result', 'strerror', 'supports_bytes_enviro
n', 'supports_dir_fd', 'supports_effective_ids', 'supports_fd', 'supports_follow
_symlinks', 'symlink', 'sys', 'system', 'terminal_size', 'times', 'times_result'
, 'truncate', 'umask', 'uname_result', 'unlink', 'urandom', 'utime', 'waitpid',
'walk', 'write']
>>> help(os)
Help on module os:

NAME
    os - OS routines for NT or Posix depending on what system we're on.

DESCRIPTION
    This exports:
      - all functions from posix or nt, e.g. unlink, stat, etc.
      - os.path is either posixpath or ntpath
      - os.name is either 'posix' or 'nt'
      - os.curdir is a string representing the current directory (always '.')
      - os.pardir is a string representing the parent directory (always '..')
      - os.sep is the (or a most common) pathname separator ('/' or '\\')
      - os.extsep is the extension separator (always '.')
      - os.altsep is the alternate pathname separator (None or '/')
      - os.pathsep is the component separator used in $PATH etc
      - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
      - os.defpath is the default search path for executables
      - os.devnull is the file path of the null device ('/dev/null', etc.)

    Programs that import and use 'os' stand a better chance of being
    portable between different platforms.  Of course, they must then
    only use functions that are defined by all platforms (e.g., unlink
    and opendir), and leave all pathname manipulation to os.path
    (e.g., split and join).

CLASSES
    builtins.Exception(builtins.BaseException)
        builtins.OSError
    builtins.object
        nt.DirEntry
    builtins.tuple(builtins.object)
        nt.times_result
        nt.uname_result
        stat_result
        statvfs_result
        terminal_size

    class DirEntry(builtins.object)
     |  Methods defined here:
     |
     |  __fspath__(self, /)
     |      Returns the path for the entry.
     |
     |  __repr__(self, /)

于日常文件和目录管理任务, shutil 模块提供了更易于使用的更高级别的接口:

python
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
'archive.db'
>>> shutil.move('/build/executables', 'installdir')
'installdir'

10.2. 文件通配符

glob 模块提供了一个在目录中使用通配符搜索创建文件列表的函数:

python
>>> import glob
>>> glob.glob('*.py')
[]

10.3. 命令行参数

通用实用程序脚本通常需要处理命令行参数。这些参数作为列表存储在 sys 模块的 argv 属性中。

demo.py

python
import sys
print(sys.argv)
python
>>> python demo.py one two three
['demo.py', 'one', 'two', 'three']

argparse 模块提供了一种处理命令行参数的机制。它应该总是优先于直接手工处理 sys.argv

argparsedemo.py

python
import argparse
from getpass import getuser
parser = argparse.ArgumentParser(description='An argparse example.')
parser.add_argument('name', nargs='?', default=getuser(), help='The name of someone to greet.')
parser.add_argument('--verbose', '-v', action='count')
args = parser.parse_args()
greeting = ["Hi", "Hello", "Greetings! its very nice to meet you"][args.verbose % 3]
print(f'{greeting}, {args.name}')
if not args.verbose:
    print('Try running this again with multiple "-v" flags!')

运行的效果:

bash
C:\Users\liujiajia>python argparsedemo.py -h
usage: argparsedemo.py [-h] [--verbose] [name]

An argparse example.

positional arguments:
  name           The name of someone to greet.

optional arguments:
  -h, --help     show this help message and exit
  --verbose, -v

C:\Users\liujiajia>python argparsedemo.py -v jiajia
Hello, jiajia

10.4. 错误输出重定向和程序终止

sys 模块还具有 stdinstdoutstderr 的属性。后者对于发出警告和错误消息非常有用,即使在 stdout 被重定向后也可以看到它们:

python
>>> import sys
>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one
47

终止脚本的最直接方法是使用 sys.exit()

10.5. 字符串模式匹配

re 模块为高级字符串处理提供 正则表达式 工具。

python
>>> 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'

10.6. 数学

math 模块提供对浮点数学的底层 C 库函数的访问:

python
>>> import math
>>> math.cos(math.pi / 4)
0.7071067811865476
>>> math.log(1024, 2)
10.0

random 模块提供了进行随机选择的工具:

python
>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10)   # sampling without replacement
[37, 46, 17, 79, 83, 36, 60, 61, 33, 29]
>>> random.random()    # random float
0.7228826439822138
>>> random.randrange(6)    # random integer chosen from range(6)
1

statistics 模块计算数值数据的基本统计属性(均值,中位数,方差等):

python
>>> 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

10.7. 互联网访问

有许多模块可用于访问互联网和处理互联网协议。其中两个最简单的 urllib.request 用于从 URL 检索数据,以及 smtplib 用于发送邮件:

python
>>> from urllib.request import urlopen
>>> with urlopen('https://www.liujiajia.me') as response:
...     for line in response:
...         line = line.decode('utf-8')  # Decoding the binary data to text.
...         if 'ICP' in line:  # look for ICP
...             print(line)
...
                <span class="copyright text-muted"><a class="text-muted" href="h
ttp://www.beian.miit.gov.cn" target="_blank">苏ICP备16003387号</a> &copy; 2016 -
 2019 刘佳佳. All Rights Reserved.

运行 smtplib 的示例需要本机运行 SMTP 服务。

python
>>> 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()

10.8. 日期和时间

datetime 模块提供了以简单和复杂的方式操作日期和时间的类。

python
>>> # dates are easily constructed and formatted
... from datetime import date
>>> now = date.today()
>>> now
datetime.date(2019, 11, 1)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'11-01-19. 01 Nov 2019 is a Friday on the 01 day of November.'
>>> # dates support calendar arithmetic
... birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
20181

10.9. 数据压缩

常见的数据存档和压缩格式由模块直接支持,包括:zlib, gzip, bz2, lzma, zipfiletarfile

python
>>> 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. 性能测量

timeit 模块可以快速演示在运行效率方面一定的优势:

python
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.02421091600001546
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.020710713999960717

timeit 的精细粒度级别相反, profilepstats 模块提供了用于在较大的代码块中识别时间关键部分的工具。

10.11. 质量控制

doctest 模块提供了一个工具,用于扫描模块并验证程序文档字符串中嵌入的测试。

python
>>> 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
TestResults(failed=0, attempted=1)

unittest 模块不像 doctest 模块那样易于使用,但它允许在一个单独的文件中维护更全面的测试集。

python
>>> 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
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

10.12. 自带电池

Python 有 “自带电池” 的理念。通过其包的复杂和强大功能可以最好地看到这一点。例如:

  • xmlrpc.clientxmlrpc.server 模块使远程过程调用实现了几乎无关紧要的任务。尽管有模块名称,但不需要直接了解或处理 XML。

  • email 包是一个用于管理电子邮件的库,包括 MIME 和其他:基于 RFC 2822 的邮件文档。与 smtplibpoplib 实际上发送和接收消息不同,电子邮件包具有完整的工具集,用于构建或解码复杂的消息结构(包括附件)以及实现互联网编码和标头协议。

  • json 包为解析这种流行的数据交换格式提供了强大的支持。 csv 模块支持以逗号分隔值格式直接读取和写入文件,这些格式通常由数据库和电子表格支持。 XML 处理由 xml.etree.ElementTreexml.domxml.sax 包支持。这些模块和软件包共同大大简化了 Python 应用程序和其他工具之间的数据交换。

  • sqlite3 模块是 SQLite 数据库库的包装器,提供了一个可以使用稍微非标准的 SQL 语法更新和访问的持久数据库。

  • 国际化由许多模块支持,包括 gettextlocale ,以及 codecs 包。