Skip to main content

常用模块

os 模块

这个模块应该是 Python 自带模块中使用率最高的一个了。一些例子:

# import os
#
# ----- 文件操作 -----
# os.rename("old.py", "new.py") # 重命名
# os.remove("a.py") # 删除
# os.stat("b.py") # 查看文件属性
#
# ----- 路径操作 -----
# os.getcwd() # 获取当前目录
# os.chdir(r"d:\list") # 更改当前目录为
# os.chdir(os.pardir) # 返回上一级目录
# os.mkdir('newfolder ') # 在当前目录新建一个文件夹
# os.listdir('c:\list') # 列出文件夹下所有文件的列表
# os.removedirs('thefolder ') # 删除空文件夹
# os.path.isfile/ispath("f") # 检查路径是文件或是目录
# os.path.exists("f") # 检查路径是否存在
#
# ----- 操作平台相关 -----
# os.sep # 当前操作系统的路径分隔符
# os.linesep # 当前操作系统的换行符
# os.path.join(r"c:\abc", "d") # 连接字串成为路径

示例:

#windows路径写法
os.listdir(r"d:/") #使用 r 声明
os.listdir("d:\\") #使用双反斜杠

pathlib 模块

Python 3提供了一个新的模块pathlib,提供了Path类型来进行更方便的路径操作:

import pathlib
p = pathlib.Path('.') #调用并赋值给p
p
PosixPath('.') #显示但钱

获得当前目录下所有的文件:

list(p.iterdir())
#结果
[PosixPath('05-09模块pathlib:路径操作.ipynb'),
PosixPath('05-06模块glob:文件模式匹配.ipynb'),
PosixPath('05-01模块sys:系统相关.ipynb'),
PosixPath('05-02模块os:与操作系统进行交互.ipynb'),
PosixPath('05-07模块math:数学.ipynb'),
PosixPath('.ipynb_checkpoints'),
PosixPath('05-03模块re:正则表达式.ipynb'),
PosixPath('05-05模块json:处理JSON数据.ipynb'),
PosixPath('05-08模块random:随机数.ipynb'),
PosixPath('05-04模块datetime:日期时间.ipynb')]

得到所有的 .ipynb文件:

list(p.glob('*.ipynb'))
#结果
[PosixPath('05-09模块pathlib:路径操作.ipynb'),
PosixPath('05-06模块glob:文件模式匹配.ipynb'),
PosixPath('05-01模块sys:系统相关.ipynb'),
PosixPath('05-02模块os:与操作系统进行交互.ipynb'),
PosixPath('05-07模块math:数学.ipynb'),
PosixPath('05-03模块re:正则表达式.ipynb'),
PosixPath('05-05模块json:处理JSON数据.ipynb'),
PosixPath('05-08模块random:随机数.ipynb'),
PosixPath('05-04模块datetime:日期时间.ipynb')]

路径运算:

p / "abc" / "123.txt"
#结果
PosixPath('abc/123.txt')

sys 模块

一般我很少用到这个模块。可能有这么几个命令会用到:

  • sys.argv:能够传递从命令行接受的参数到代码内。
  • sys.platform:当前操作系统平台。
  • sys.exit():无参数时抛出 SystemExit 错误并退出;有参数时会在退出前输出对应的字符串到屏幕。
import sys
sys.platform
'win32'

一个 sys.argv 的例子:

sys.argv
['e:\\python\\lib\\site-packages\\ipykernel_launcher.py',
'-f',
'C:\\Users\\wklchris\\AppData\\Roaming\\jupyter\\runtime\\kernel-3724c4c9-2130-485d-b388-7a84379fd043.json']

以上不是典型的例子,因为并不是在命令行下运行的。命令行下通常有如下格式:

python test.py hello

此时,sys.argv[0] = test.py,sys.argv[1] = hello.

random随机数模块

函数 random.randint()可以产生一个随机整数。产生一个1到9之间的随机整数:

import random
random.randint(1, 9)
4

random.randint(1, 9)
8

函数 random.random()可以生成一个在0到1之间的随机数:

random.random()
0.9131366648833286

函数 random.choice()可以从一个序列中随机选择一个元素:

a = [2, 3.2, "abc"]
random.choice(a)
2

函数 random.shuffle()可以将序列中元素的顺序进行打乱:

b = list(range(20))
b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

random.shuffle(b)
b
[5, 1, 9, 3, 0, 16, 17, 13, 10, 12, 7, 4, 6, 18, 15, 8, 2, 14, 19, 11]

函数random.sample()可以从序列中不放回地随机采样元素,如采样3个元素:

random.sample(b, 3)
[17, 7, 3]

glob 模块

glob模块是与文件模式匹配相关的标准库模块,提供了方便的文件模式匹配方法:

匹配当前文件夹下所有的.ipynb文件:

import glob
glob.glob("*.ipynb")
['05-06模块glob:文件模式匹配.ipynb',
'05-01模块sys:系统相关.ipynb',
'05-02模块os:与操作系统进行交互.ipynb',
'05-03模块re:正则表达式.ipynb',
'05-05模块json:处理JSON数据.ipynb',
'05-04模块datetime:日期时间.ipynb']

一般来说,glob.glob()函数支持三种格式的语法:

  • “*”:匹配单个或多个字符,除了路径分隔符。
  • “?”:匹配任意单个字符。
  • “[seq]”:匹配指定范围内的单个字符,如:[0-9]匹配单个数字。
  • “[!seq]”:匹配非指定范围内的单个字符,如:[!0-9]匹配非数字的单个字符。
  • 如果要匹配“ ”和“?”本身,可以使用“[ ]”和“[?]”来转义。

datetime 模块

日期date对象

import datetime as dt

产生一个有年月日信息的date对象:

d1 = dt.date(2007, 9, 25)
d1
datetime.date(2007, 9, 25)
d2 = dt.date(2008, 9, 25)

分别表示2008年9月25日和2007年9月25日。日期可以打印出来:

print(d1)
2007-09-25

还可以调用date对象的 .strftime()方法将日期转化为特定格式:

d1.strftime('%A, %m/%d/%y')
'Tuesday, 09/25/07'

d1.strftime('%a, %m-%d-%Y')
'Tue, 09-25-2007'

时间间隔timedelta对象

两个日期可以相减:

d2 - d1
datetime.timedelta(days=366)

时间time对象

产生两个时间对象:

t1 = dt.time(15, 38)
t2 = dt.time(18)

分别表示15点38分和18点整:

print(t1)
15:38:00

t2
datetime.time(18, 0)

输出格式同样可以用 .strftime()方法改变:

t1.strftime('%H:%M:%S, %p')
'15:38:00, PM'

日期时间datetime对象

同时带日期与时间的对象:

dt.datetime(2022, 3, 7, 2, 49, 39)
datetime.datetime(2022, 3, 7, 2, 49, 39)

d1 = dt.datetime.now()
print(d1)
2022-05-02 21:05:26.567396

date和datetime对象都支持减法;此外,它们还支持与timedelta对象的加法。例如,将当前时间加上30天:

print(d1 + dt.timedelta(30))
2022-06-01 21:05:26.567396

日期格式

字符含义
%a星期英文缩写
%A星期英文
%w一星期的第几天,[0(sun),6]
%b月份英文缩写
%B月份英文
%d日期,[01,31]
%H小时,[00,23]
%I小时,[01,12]
%j一年的第几天,[001,366]
%m月份,[01,12]
%M分钟,[00,59]
%pAM 和PM
%S秒钟,[00,61]
%U一年中的第几个星期,星期日为第一天,[00,53]
%W一年中的第几个星期,星期一为第一天,[00,53]
%y没有世纪的年份
%Y完整的年份

math 模块

math模块的主要功能是计算数学函数。例如:计算平方根:

import math
math.sqrt(16)
4.0

除了数学函数之外,模块中还有一些数学常数。例如,圆周率:

math.pi
3.141592653589793

自然底数:

math.e
2.718281828459045

三角函数:

math.cos(0)
1.0

math.sin(math.pi / 2)
1.0

math.tan(math.pi / 4)
0.9999999999999999

反三角函数:

math.asin(1)
1.5707963267948966

math.acos(0)
1.5707963267948966

math.atan(1)
0.7853981633974483

对数和指数:

math.log(10)
2.302585092994046

math.exp(math.log(10))
10.000000000000002

math.log1p(1)
0.6931471805599453

math.expm1(0.6931471805599453)
1.0

近似,向上取整和向下取整:

math.ceil(10.2)
11

math.floor(10.2)
10

JSON模块

用于使用JSON序列化和反序列化对象

re 模块:正则表达式

参考本文附录。

其他模块

  • collection 模块:
    • 提供了一种双端列表 deque,可以用 appendleft, extendleft, popleft 等方法从 deque 的左侧(也就是lst[0])进行操作。注意,deque 的更新操作比 list 更快,但读取操作比 list 慢。
    • 提供了一种缺省字典 defaultdict,可以直接操作键值(即使这个键先前未定义);首次操作时会赋一个合理的初值,比如首次调用 d["a"] += 1 而字典本身没有 “a” 键时,会自动初始化 “a” 键并赋初值 0。
  • calendar 模块:判断星期、闰年,输出日历等等。
  • itertools 模块:在本文“迭代器”小节已进行了简要介绍。
  • logging 模块:在调试中可能会使用。
  • urllib 模块:这是一个 HTML 请求模块,常用于爬虫。

附录:正则表达式

正则表达式的基础内容参考本博客的这篇博文:正则表达式。注意:如果要保存一个正则表达式供多次使用,请存储其 compile 后的结果,避免反复编译。

  • re.compile(exp):编译正则表达式。
  • re.compile(exp).match(str):判断正则表达式能否匹配一个字串。可以 bool() 结果来获知是否匹配。
    • re.compile(exp).match(str).groups():将匹配结果返回为单个字符串(无子组时)或元组(有子组时)。
    • re.compile(exp).findall(str):找出字符串中所有匹配表达式的子串。返回列表。
  • re.split(exp, str):用表达式来分割字符串,相当于 str.split() 的增强版。
import re
bool(re.match(r"\d", "1"))
True
phone_re = re.compile(r'\d{3,4}-\d{7,8}')
phone_re.match('010-12345678').group()
'010-12345678'
# 如果在正则表达式中添加了子组(小括号),那么会返回子组依顺序组成的一个元组
phone_re = re.compile(r'(\d{3,4})-(\d{7,8})')
phone_re.match('010-12345678').groups()
('010', '12345678')
phone_re = re.compile(r'\d{3,4}-\d{7,8}') # 寻找所有子串
phone_set = '010-12345678, 021-65439876 '
phone_re.findall(phone_set)
['010-12345678', '021-65439876']
s = 'a b c' # 用 re.split() 处理连续的空格
print(s.split(' '), re.split(r"\s+", s))
['a', 'b', '', '', 'c'] ['a', 'b', 'c']