【教程】Python中的常见模块(pip/time/os/json/random)

文章目录

一、模块的下载(pip)

pip是python解释器自带的下载包插件,使用命令可以下载需要的模块。

1.模块的基本安装命令

功能 命令
安装新包 pip install <包名>
安装本地包 pip install <目录>/<文件名>
升级包 pip install <包名> --upgrade
卸载包 pip uninstall <包名>
查看已安装的包 pip list
导出已经安装的模块到requirements.txt pip freeze >requirements.txt
安装requirements.txt里的所有包 pip install -r requirements.txt

2.更换国内源

由于国外源下载速度较慢,因此更换国内源可以提高速率

1.常用的国内源

python 复制代码
阿里云 http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

2.临时修改国内源

在使用pip的时候在后面加上-i参数,指定pip源

python 复制代码
pip install <包名> -i https://pypi.tuna.tsinghua.edu.cn/simple

3.多个版本的python环境干扰

当有python2和python3环境干扰时候,出现

复制代码
Fatal error in launcher: Unable to create process using 

解决办法:

复制代码
python2 -m pip install <包名>
或者
python3 -m pip install <包名>

4.快速搭建环境

问题:当我们去了一个新公司,想要项目跑起来,需要搭配项目所需要的环境,但是版本的差异可能会影响项目的运行

1.安装pipreqs

复制代码
pip install pipreqs

2.在项目中生成当前项目所有模块的下载清单

复制代码
例如对上次文件项目,生成清单,命令行运行
pipreqs ./

3.按清单安装模块

复制代码
pip install -r requirements.txt

二、os模块:文件、目录和路径操作

os 模块主要用于操作文件、目录和系统路径,使用前需要先导入:

python 复制代码
import os

1.文件操作

方法 说明 示例
os.rename() 重命名文件或目录 os.rename("1.txt", "2.txt")
os.remove() 删除文件 os.remove("test.txt")
python 复制代码
import os

# 将 1.txt 重命名为 2.txt
os.rename("1.txt", "2.txt")

# 删除 test.txt
os.remove("test.txt")

以上方法执行成功时没有返回结果;如果文件不存在,会抛出 FileNotFoundError

2.目录操作

方法 说明 示例
os.mkdir() 创建单级目录 os.mkdir("dir1")
os.rmdir() 删除空目录 os.rmdir("dir1")
os.makedirs() 递归创建多级目录 os.makedirs("dir1/dir2")
os.removedirs() 递归删除空目录 os.removedirs("dir1/dir2")
os.getcwd() 获取当前工作目录 os.getcwd()
os.chdir() 修改当前工作目录 os.chdir("E:/")
os.listdir() 获取目录中的文件和目录 os.listdir(".")

1. 创建和删除目录

python 复制代码
import os

os.mkdir("dir1") # 创建单级目录
print(os.path.exists("dir1"))  # 输出:True

os.rmdir("dir1") # 删除空目录
print(os.path.exists("dir1"))   # 输出:False

创建多级目录:

python 复制代码
import os

path = os.path.join("dir1", "dir2")
os.makedirs(path)

print(os.path.exists(path))   # 输出:True

如果目录可能已经存在,可以设置 exist_ok=True

python 复制代码
os.makedirs(path, exist_ok=True)

删除多级空目录:

python 复制代码
os.removedirs(path)
print(os.path.exists(path))   # 输出:False

os.removedirs() 会继续尝试删除上层空目录,使用时需要谨慎。

2. 获取和修改工作目录

python 复制代码
import os

print(os.getcwd())    # 示例输出:E:\python\文件操作

os.chdir("E:/")
print(os.getcwd())    # 示例输出:E:\

工作目录是程序处理相对路径时使用的起点,不一定等于当前 Python 文件所在目录。

3. 查看目录内容

python 复制代码
import os

result = os.listdir(".")    
print(result)    # 示例输出:['test.py', '1.txt', 'images']

返回结果是列表,只包含文件或目录名称,不包含完整路径。

3.路径判断

方法 说明 返回值
os.path.exists(path) 判断路径是否存在 bool
os.path.isfile(path) 判断路径是否为文件 bool
os.path.isdir(path) 判断路径是否为目录 bool
os.path.isabs(path) 判断是否为绝对路径 bool

假设当前目录中存在 test.py 文件和 images 目录:

python 复制代码
import os

print(os.path.exists("test.py"))
# 输出:True

print(os.path.isfile("test.py"))
# 输出:True

print(os.path.isdir("test.py"))
# 输出:False

print(os.path.isdir("images"))
# 输出:True

判断绝对路径:

python 复制代码
import os

print(os.path.isabs("test.py"))
# 输出:False

print(os.path.isabs(r"E:\python\test.py"))
# 输出:True

print(os.path.isabs(os.getcwd()))
# 输出:True

4.路径处理

方法 说明 示例
os.path.abspath() 获取绝对路径 os.path.abspath("test.py")
os.path.basename() 获取路径的最后一部分 os.path.basename(path)
os.path.dirname() 获取路径的目录部分 os.path.dirname(path)
os.path.join() 拼接路径 os.path.join("dir1", "test.txt")
os.path.split() 分割目录和最后一部分 os.path.split(path)
os.path.splitext() 分割文件路径和扩展名 os.path.splitext(path)
os.path.commonprefix() 按字符获取公共前缀 os.path.commonprefix(paths)
os.path.commonpath() 获取有效公共路径 os.path.commonpath(paths)

1. 获取绝对路径

python 复制代码
import os

path = os.path.abspath("test.py")
print(path)
# 示例输出:E:\python\文件操作\test.py

输出结果与当前工作目录有关。

2. 获取文件名和目录

python 复制代码
import os

path = r"E:\python\文件操作\test.py"

print(os.path.basename(path))    # 输出:test.py
print(os.path.dirname(path))   # 输出:E:\python\文件操作

basename() 获取最后一部分,dirname() 获取最后一部分之前的路径。

3. 分割路径

python 复制代码
import os

path = r"E:\python\文件操作\test.py"

print(os.path.split(path))   # 输出:('E:\\python\\文件操作', 'test.py')
print(os.path.splitext(path))   # 输出:('E:\\python\\文件操作\\test', '.py')
方法 分割结果
os.path.split() 目录部分和最后一部分
os.path.splitext() 文件路径和扩展名

4. 拼接路径

不推荐直接使用字符串拼接路径:

python 复制代码
# 不推荐
path = "dir1" + "/" + "test.txt"

推荐使用 os.path.join()

python 复制代码
import os

path = os.path.join("dir1", "dir2", "test.txt")
print(path)
# Windows 示例输出:dir1\dir2\test.txt

os.path.join() 会根据当前操作系统使用合适的路径分隔符。

5. 获取公共路径

commonprefix() 按字符比较:

python 复制代码
import os

paths = ["111123", "113", "13242"]
print(os.path.commonprefix(paths))   # 输出:1

处理真实文件路径时,更推荐 commonpath()

python 复制代码
import os

paths = [
    r"E:\python\project\a.txt",
    r"E:\python\project\images\b.png"
]

print(os.path.commonpath(paths))   # 输出:E:\python\project
方法 比较方式 结果特点
commonprefix() 按字符串字符比较 结果不一定是有效路径
commonpath() 按路径结构比较 返回有效公共路径

5.获取当前 Python 文件路径

__file__ 表示当前 Python 文件的路径。

假设当前文件是 E:\python\文件操作\test.py

python 复制代码
import os

print(__file__)
# 示例输出:E:\python\文件操作\test.py

print(os.path.basename(__file__))
# 输出:test.py

print(os.path.dirname(__file__))
# 示例输出:E:\python\文件操作

print(os.path.abspath(__file__))
# 示例输出:E:\python\文件操作\test.py

获取当前文件所在目录:

python 复制代码
current_dir = os.path.dirname(os.path.abspath(__file__))

print(current_dir)
# 示例输出:E:\python\文件操作

需要注意:在某些交互式环境中,例如部分 Notebook 或 Python 交互终端,__file__ 可能不存在。

6.Windows 路径写法

Windows 路径中的反斜杠可能被识别为转义字符。

不推荐:

python 复制代码
path = "E:\new\test.txt"

其中 \n\t 可能分别被识别为换行和制表符。

推荐以下写法:

python 复制代码
# 原始字符串
path1 = r"E:\new\test.txt"

# 双反斜杠
path2 = "E:\\new\\test.txt"

# 正斜杠
path3 = "E:/new/test.txt"

# os.path.join()
path4 = os.path.join("E:/", "new", "test.txt")
python 复制代码
print(path1)  # E:\new\test.txt
print(path2)  # E:\new\test.txt
print(path3)  # E:/new/test.txt
print(path4)  # E:/new\test.txt

最后一个结果的分隔符形式与系统和传入路径有关,但它仍然是有效路径。

7.注意事项

注意点 说明
os.remove() 只能删除文件,不能删除目录
os.rmdir() 只能删除空目录
os.removedirs() 会继续尝试删除上层空目录,使用时要谨慎
os.mkdir() 不能直接创建不存在的多级目录
os.makedirs() 可以递归创建多级目录
os.getcwd() 获取工作目录,不一定是代码文件目录
os.path.exists() 路径不存在时返回 False,不会报错
commonprefix() 按字符比较,结果不一定是有效路径
删除和重命名 操作前建议先判断路径是否存在

安全删除文件:

python 复制代码
import os

path = "test.txt"

if os.path.isfile(path):
    os.remove(path)
    print("文件删除成功")
else:
    print("文件不存在")

示例输出:

text 复制代码
文件删除成功

三、random模块:随机数、随机抽取和打乱顺序

使用前需要先导入:

python 复制代码
import random

random 生成的是伪随机数,适合模拟、抽奖和测试等普通场景,不适合生成密码、验证码或安全令牌。安全场景应使用 secrets 模块。

1.常用函数

函数 作用 返回值
random.random() 生成 [0.0, 1.0) 范围内的随机浮点数 float
random.randint(a, b) 生成 [a, b] 范围内的随机整数 int
random.randrange(start, stop, step) 从指定整数序列中随机选择一个值 int
random.uniform(a, b) 生成 ab 之间的随机浮点数 float
random.choice(seq) 从非空序列中随机选择一个元素 单个元素
random.choices(seq, k=n) 有放回地随机抽取多个元素,结果可能重复 list
random.sample(seq, k=n) 无放回地随机抽取多个不重复元素 list
random.shuffle(list) 原地打乱列表顺序 None
random.seed(value) 设置随机种子,使结果可以复现 None

2.特殊函数举例

1. randint()

randint(a, b) 生成包含两端的随机整数,只接收开始值和结束值,不支持步长

python 复制代码
import random

result = random.randint(1, 10)
print(result)
# 示例输出:1

2. randrange()

randrange() 的参数采用左闭右开区间。

写法 取值范围
randrange(stop) 0stop - 1
randrange(start, stop) startstop - 1
randrange(start, stop, step) 从指定步长序列中随机取值
python 复制代码
import random

print(random.randrange(10))
# 示例输出:8

result = random.randrange(1, 10, 2)
print(result)
# 示例输出:3

3. choice()

choice() 从非空序列中随机选择一个元素,可以用于列表、元组和字符串。

如果传入空序列,会抛出 IndexError

python 复制代码
import random

print(random.choice([1, 2, 3, 4, 5]))
# 示例输出:2

print(random.choice(("张三", "李四", "王五")))
# 示例输出:李四

print(random.choice("Python"))
# 示例输出:h

4. choices()

choices() 进行有放回抽取,同一个元素可能被抽中多次。

python 复制代码
import random

result = random.choices([1, 2, 3], k=5)
print(result)
# 示例输出:[3, 2, 3, 1, 3]

设置权重:

python 复制代码
result = random.choices(
    [1, 2, 3],
    weights=[1, 2, 3],
    k=5
)

print(result)
# 示例输出:[3, 2, 3, 3, 1]

权重表示相对抽中概率:

元素 权重 相对概率
1 1 1/6
2 2 2/6
3 3 3/6

权重越大,被抽中的概率越高,但不能保证每次结果都符合固定比例。

也可以使用累计权重 cum_weights

python 复制代码
result = random.choices(
    [1, 2, 3],
    cum_weights=[1, 3, 6],
    k=5
)

weightscum_weights 不能同时使用。

5. sample()

sample() 进行无放回抽取,结果中的元素不会重复。

python 复制代码
import random

result = random.sample([1, 2, 3, 4], k=4)
print(result) # 示例输出:[3, 1, 4, 2]

k 不能大于序列中可选元素的数量,否则会抛出 ValueError

python 复制代码
# random.sample([1, 2, 3], k=4)

choice、choices 和 sample 对比

函数 抽取数量 是否可能重复 是否支持权重
choice() 1 个 -
choices() 多个 可能重复
sample() 多个 不重复

6.shuffle()

shuffle() 的参数必须是可修改序列,通常使用列表。会直接修改原列表,不会生成新列表,返回值始终是 None

python 复制代码
import random

list01 = [1, 2, 3, 4, 5]
result = random.shuffle(list01)

print(list01)  # 示例输出:[3, 1, 4, 2, 5]
print(result)  # 输出:None

四、time模块

1.时间模块转换图

2.时间模块转换举例

1.获取时间戳

python时间戳取整为10位,单位为s

python 复制代码
import time

print(time.time())  # 1621235477.11

print(int(time.time()))  # 1621235477

2.休眠

程序停止运行x秒

python 复制代码
time.sleep(3)

3.获取时间元组

python 复制代码
#显示当前时间的时间元组
print(time.localtime())
print(time.localtime(time.time())) # 同time.localtime()
python 复制代码
#显示一个小时前的时间元组
print(time.localtime(time.time()-3600))
python 复制代码
# 显示utc时间的时间元组
print(time.gmtime())

4.时间元组与其他格式的相互转换

时间元组 → 格式化时间

python 复制代码
time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
# 2021-05-17 15:17:32

格式化时间 → 时间元组

python 复制代码
time.strptime('2021-05-17 15:17:32','%Y-%m-%d %H:%M:%S')

时间元组 → 时间戳

python 复制代码
print(time.mktime(t)) # 1621235956.0

时间戳格式 → 时间元组

python 复制代码
print(time.localtime(time.time())) # 获取时间戳
# time.struct_time(tm_year=2022, tm_mon=1, tm_mday=14, tm_hour=15, tm_min=1, tm_sec=24, tm_wday=4, tm_yday=14, tm_isdst=0)

例:

python 复制代码
# --------------将时间戳转为格式化时间 
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) 
# 2023-05-09 17:39:5


# ------------将格式化时间转为时间戳
print(time.mktime(time.strptime('2023-05-09 17:39:54', '%Y-%m-%d %H:%M:%S')))
# 1683625194.0

3.结构化时间

符号 含义
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(0000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00-59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
python 复制代码
def format_Date1(date):
    import datetime
    time_format = str(datetime.datetime.strptime(date, '%b %d, %Y, %H:%M:%S'))
    return time_format


print(format_Date1('Dec 4, 2019, 4:25:41'))

结果:


五、json模块

  • json 内置模块用于在 Python 数据类型JSON 字符串/文件 之间进行转换。
  • JSON 常用于接口数据、配置文件、前后端数据传输和简单数据存储。
  • JSON 本质上是一种字符串格式,但它有固定的数据规则。
  • JSON 字符串必须用双引号

1.四个常见方法

方法 作用 返回值
json.dumps(list/dict) Python 对象转 JSON 字符串 json字符串
json.loads(json字符串) JSON 字符串转 Python 对象 dictlist
json.dump(list/dict,fp) Python 对象写入 JSON 文件 None
json.load(fp) 从 JSON 文件读取 Python 对象 python的list或者dict

2.举例使用

python 复制代码
import json

data = {
    "name": "张三",
    "age": 18,
    "is_vip": True,
    "hobby": ["python", "爬虫"],
    "address": None
}

json_str = json.dumps(data)

print(json_str)
print(type(json_str))

输出:

python 复制代码
{"name": "\u5f20\u4e09", "age": 18, "is_vip": true, "hobby": ["python", "\u722c\u866b"], "address": null}
<class 'str'>
  • 中文默认会被转义成 Unicode,如果希望中文正常显示,可以设置 json.dumps(data, ensure_ascii=False)
  • 如果希望格式更整齐,可以设置格式化缩进 json.dumps(data, ensure_ascii=False, indent=4)

3.一些注意事项

  • Python的 dict中的非字符串key被转换成JSON字符串时都会被转换为小写字符串;
  • Python中的tuple,在序列化时会被转换为array,但是反序列化时,array会被转化为list;
  • 对于Python内置的数据类型(如:str, unicode, int, float, bool, None, list, tuple, dict)json模块可以直接进行序列化/反序列化处理;