Python的内置模块是无需额外安装、开箱即用的核心工具库,覆盖文件操作、系统交互、时间处理、随机数生成、数据序列化等高频场景。本文聚焦os(文件/目录操作)、sys(系统参数交互)、datetime(时间日期处理)、random(随机数生成)、json(数据序列化)5个最常用的内置模块,从基础语法到实战场景,搭配可直接运行的代码示例,覆盖搜索引擎高频检索需求(如Python文件路径处理、时间格式转换、随机数生成、JSON解析),适合零基础快速掌握内置模块核心用法。
一、5大内置模块核心定位
先明确每个模块的核心用途,避免"用错工具":
| 模块 | 核心功能 | 典型应用场景 |
|---|---|---|
os |
操作系统交互(文件/目录/路径) | 创建文件夹、遍历文件、路径拼接 |
sys |
Python解释器交互(参数/环境/退出) | 命令行传参、获取系统信息、程序退出 |
datetime |
时间日期处理(解析/转换/计算) | 日志时间戳、时间差计算、格式标准化 |
random |
随机数/随机选择(伪随机) | 抽奖程序、数据采样、验证码生成 |
json |
JSON数据序列化(读写/解析) | 接口数据交互、配置文件读写、数据存储 |
二、os模块:文件与目录操作的核心
os模块是Python操作文件系统的"万能工具",无需第三方库即可实现文件创建、删除、目录遍历等操作,跨平台兼容性强。
1. 核心基础用法
(1)获取当前工作目录
python
import os
# 获取当前工作目录(绝对路径)
current_dir = os.getcwd()
print("当前工作目录:", current_dir) # 输出示例:C:\Users\XXX\Desktop
(2)创建/删除目录
python
import os
# 1. 创建单个目录
os.mkdir("test_dir") # 在当前目录创建test_dir文件夹
print("单个目录创建完成")
# 2. 创建多级目录(父目录不存在时自动创建)
os.makedirs("parent_dir/child_dir", exist_ok=True) # exist_ok=True避免目录已存在报错
print("多级目录创建完成")
# 3. 删除空目录
os.rmdir("test_dir") # 仅能删除空目录
print("空目录删除完成")
# 4. 删除多级目录(需确保目录空,或用shutil模块)
os.removedirs("parent_dir/child_dir") # 递归删除空目录
print("多级空目录删除完成")
(3)文件操作(重命名/删除)
python
import os
# 1. 文件重命名
os.rename("old_file.txt", "new_file.txt") # 需确保old_file.txt存在
print("文件重命名完成")
# 2. 删除文件
os.remove("new_file.txt") # 永久删除,无法恢复
print("文件删除完成")
(4)路径拼接(跨平台兼容)
python
import os
# 拼接路径(自动适配Windows的\和Linux的/)
dir_path = "data"
file_name = "user.csv"
full_path = os.path.join(dir_path, file_name) # 结果:data/user.csv(Linux)或data\user.csv(Windows)
print("拼接后的路径:", full_path)
# 获取文件扩展名
ext = os.path.splitext(file_name)[1]
print("文件扩展名:", ext) # 输出:.csv
# 获取文件所在目录
file_dir = os.path.dirname(full_path)
print("文件所在目录:", file_dir) # 输出:data
2. 进阶用法:遍历目录文件
python
import os
# 示例1:遍历目录下所有文件(含子目录)
def traverse_dir(dir_path):
for root, dirs, files in os.walk(dir_path):
print(f"当前目录:{root}")
print(f"子目录:{dirs}")
print(f"文件:{files}")
print("-" * 50)
# 遍历当前目录
traverse_dir(".")
# 示例2:筛选指定类型文件(如.csv文件)
csv_files = []
for root, dirs, files in os.walk("."):
for file in files:
if file.endswith(".csv"): # 筛选.csv后缀
csv_files.append(os.path.join(root, file))
print("所有CSV文件路径:", csv_files)
3. 实用技巧:判断文件/目录是否存在
python
import os
path = "data/user.csv"
# 判断路径是否存在
if os.path.exists(path):
print(f"{path} 存在")
# 判断是否为文件
if os.path.isfile(path):
print(f"{path} 是文件")
# 判断是否为目录
elif os.path.isdir(path):
print(f"{path} 是目录")
else:
print(f"{path} 不存在")
三、sys模块:与Python解释器交互
sys模块主要用于获取Python解释器的系统信息、命令行参数传递、程序退出控制等,是脚本开发的常用工具。
1. 核心基础用法
(1)命令行参数传递
python
import sys
# sys.argv:获取命令行参数列表(第一个元素是脚本名)
print("命令行参数列表:", sys.argv)
# 示例:运行脚本时传递参数 python script.py 张三 25
if len(sys.argv) >= 3:
name = sys.argv[1]
age = sys.argv[2]
print(f"姓名:{name},年龄:{age}")
else:
print("请传递姓名和年龄参数")
(2)获取系统信息
python
import sys
# 获取Python版本
print("Python版本:", sys.version)
# 获取操作系统类型(win32/linux等)
print("操作系统类型:", sys.platform)
# 获取Python解释器路径
print("解释器路径:", sys.executable)
(3)程序退出控制
python
import sys
print("程序开始执行")
# 正常退出(状态码0表示成功)
sys.exit(0)
# 以下代码不会执行
print("程序结束执行")
# 异常退出(状态码非0表示失败)
# sys.exit(1)
2. 进阶用法:设置递归深度/编码
python
import sys
# 1. 设置递归最大深度(默认约1000)
sys.setrecursionlimit(2000) # 调整为2000
# 2. 获取默认编码
print("默认编码:", sys.getdefaultencoding())
# 3. 标准输入输出(替代print/input,更灵活)
sys.stdout.write("使用stdout输出\n") # 类似print
user_input = sys.stdin.readline() # 类似input,读取一行输入
print("用户输入:", user_input.strip())
四、datetime模块:时间日期的精准处理
datetime模块提供了比time模块更强大的时间处理功能,支持时间解析、格式转换、时间差计算,避免手动处理时间戳的繁琐。
1. 核心基础用法
(1)获取当前时间/日期
python
from datetime import datetime, date, time
# 1. 获取当前日期时间(datetime对象)
now = datetime.now()
print("当前日期时间:", now) # 输出示例:2024-05-20 14:30:25.123456
# 2. 获取当前日期(date对象)
today = date.today()
print("当前日期:", today) # 输出示例:2024-05-20
# 3. 获取当前时间(time对象)
current_time = datetime.now().time()
print("当前时间:", current_time) # 输出示例:14:30:25.123456
(2)时间格式转换(str与datetime互转)
python
from datetime import datetime
# 1. datetime对象转字符串(格式化输出)
now = datetime.now()
# 常用格式:年-月-日 时:分:秒
str_time = now.strftime("%Y-%m-%d %H:%M:%S")
print("格式化时间字符串:", str_time) # 输出:2024-05-20 14:35:40
# 2. 字符串转datetime对象(解析时间)
time_str = "2024-01-01 10:00:00"
datetime_obj = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")
print("解析后的datetime对象:", datetime_obj)
# 常用时间格式化符号:
# %Y:4位数年份(2024),%m:2位数月份(05),%d:2位数日期(20)
# %H:24小时制(14),%M:分钟(35),%S:秒(40)
(3)时间差计算(timedelta)
python
from datetime import datetime, timedelta
now = datetime.now()
print("当前时间:", now)
# 1. 计算3天后的时间
future_time = now + timedelta(days=3)
print("3天后的时间:", future_time)
# 2. 计算2小时前的时间
past_time = now - timedelta(hours=2)
print("2小时前的时间:", past_time)
# 3. 计算两个时间的差值
time1 = datetime(2024, 5, 20)
time2 = datetime(2024, 5, 15)
diff = time1 - time2
print("时间差:", diff.days, "天") # 输出:5 天
2. 进阶用法:时区处理(UTC与本地时间)
python
from datetime import datetime, timezone, timedelta
# 1. 获取UTC时间
utc_now = datetime.now(timezone.utc)
print("UTC时间:", utc_now)
# 2. 转换为东8区时间(UTC+8)
cst_now = utc_now.astimezone(timezone(timedelta(hours=8)))
print("东8区时间:", cst_now.strftime("%Y-%m-%d %H:%M:%S"))
五、random模块:随机数与随机选择
random模块用于生成伪随机数(可通过seed固定序列),支持随机整数、浮点数、随机选择、打乱序列等操作,适用于抽奖、采样等场景。
1. 核心基础用法
(1)生成随机数
python
import random
# 1. 生成[0.0, 1.0)之间的随机浮点数
random_float = random.random()
print("随机浮点数:", random_float)
# 2. 生成指定范围的随机整数(包含首尾)
random_int = random.randint(1, 100) # 1~100之间的整数
print("1~100随机整数:", random_int)
# 3. 生成指定步长的随机整数
random_step = random.randrange(0, 10, 2) # 0、2、4、6、8中随机选
print("步长为2的随机整数:", random_step)
# 4. 生成指定范围的随机浮点数
random_uniform = random.uniform(1.5, 3.5) # 1.5~3.5之间的浮点数
print("1.5~3.5随机浮点数:", random_uniform)
(2)随机选择与序列打乱
python
import random
# 1. 从列表中随机选择一个元素
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
random_fruit = random.choice(fruits)
print("随机选择的水果:", random_fruit)
# 2. 从列表中随机选择多个不重复元素(抽样)
random_sample = random.sample(fruits, 2) # 选2个不重复元素
print("随机抽样2个水果:", random_sample)
# 3. 打乱列表顺序(原地修改)
random.shuffle(fruits)
print("打乱后的水果列表:", fruits)
2. 实用技巧:固定随机序列(复现结果)
python
import random
# 设置随机种子(种子相同,生成的随机序列相同)
random.seed(10)
print("种子10生成的随机数1:", random.randint(1, 100))
print("种子10生成的随机数2:", random.randint(1, 100))
# 重新设置相同种子,复现随机序列
random.seed(10)
print("复现的随机数1:", random.randint(1, 100))
print("复现的随机数2:", random.randint(1, 100))
六、json模块:JSON数据的序列化与解析
json模块是Python处理JSON数据的标准库,支持Python对象(字典、列表)与JSON字符串的互转,是接口交互、配置文件读写的核心工具(详细JSON文件读写见前文,此处聚焦核心用法)。
1. 核心基础用法
(1)Python对象转JSON字符串(dumps)
python
import json
# Python字典(支持列表、字符串、数字、布尔值、None)
data = {
"name": "张三",
"age": 25,
"city": "北京",
"is_student": False,
"hobbies": ["篮球", "编程"]
}
# 转换为JSON字符串(ensure_ascii=False保留中文,indent格式化)
json_str = json.dumps(data, ensure_ascii=False, indent=4)
print("Python对象转JSON字符串:\n", json_str)
(2)JSON字符串转Python对象(loads)
python
import json
# JSON字符串(注意键值对用双引号)
json_str = '''
{
"name": "李四",
"age": 30,
"city": "上海",
"is_student": True,
"hobbies": ["足球", "阅读"]
}
'''
# 解析为Python字典
data = json.loads(json_str)
print("JSON字符串转Python字典:", data)
print("姓名:", data["name"], ",爱好:", data["hobbies"][0])
(3)JSON文件读写(dump/load)
python
import json
# 1. 写入JSON文件
data = {"name": "王五", "age": 28, "city": "广州"}
with open("user.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
print("JSON文件写入完成")
# 2. 读取JSON文件
with open("user.json", "r", encoding="utf-8") as f:
read_data = json.load(f)
print("读取的JSON数据:", read_data)
2. 进阶用法:处理复杂Python对象(自定义序列化)
python
import json
from datetime import datetime
# 自定义类
class User:
def __init__(self, name, age, create_time):
self.name = name
self.age = age
self.create_time = create_time
# 自定义序列化函数(将User对象转为字典)
def user_serializer(obj):
if isinstance(obj, User):
return {
"name": obj.name,
"age": obj.age,
"create_time": obj.create_time.strftime("%Y-%m-%d %H:%M:%S")
}
raise TypeError(f"无法序列化类型:{type(obj)}")
# 创建User对象
user = User("赵六", 26, datetime.now())
# 序列化(指定default参数)
json_str = json.dumps(user, ensure_ascii=False, indent=4, default=user_serializer)
print("自定义对象序列化:\n", json_str)
七、完整实战案例:多模块协同应用
场景:生成随机用户数据,按时间戳命名保存为JSON文件
python
import os
import random
import json
from datetime import datetime
# 1. 定义用户数据生成函数
def generate_random_user():
names = ["张三", "李四", "王五", "赵六", "孙七", "周八"]
cities = ["北京", "上海", "广州", "深圳", "杭州", "成都"]
return {
"name": random.choice(names),
"age": random.randint(20, 40),
"city": random.choice(cities),
"register_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"is_active": random.choice([True, False])
}
# 2. 生成10条随机用户数据
user_list = [generate_random_user() for _ in range(10)]
# 3. 创建数据存储目录(不存在则创建)
data_dir = "user_data"
if not os.path.exists(data_dir):
os.makedirs(data_dir)
# 4. 按时间戳命名文件(避免重复)
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
file_path = os.path.join(data_dir, f"user_data_{timestamp}.json")
# 5. 写入JSON文件
with open(file_path, "w", encoding="utf-8") as f:
json.dump(user_list, f, ensure_ascii=False, indent=4)
print(f"10条随机用户数据已保存至:{file_path}")
八、常见问题与避坑指南
| 常见错误 | 原因分析 | 解决方法 |
|---|---|---|
| os.mkdir创建多级目录报错 | mkdir仅支持创建单个目录,父目录不存在时失败 | 改用os.makedirs并添加exist_ok=True |
| datetime格式化符号错误 | 混淆%Y(4位年)与%y(2位年)、%H(24小时)与%I(12小时) | 对照格式化符号表,按需选择 |
| JSON序列化中文乱码 | 未设置ensure_ascii=False,中文被转为\u编码 | dumps/dump时添加ensure_ascii=False |
| random.seed无效 | seed设置后仅对后续第一次随机操作生效,或多次设置不同种子 | 统一在程序开头设置一次种子 |
| sys.argv参数获取失败 | 命令行传递参数数量不足,或索引错误(从1开始) | 先判断len(sys.argv),再获取参数 |
九、进阶技巧
1. os模块路径处理(Python3.4+推荐pathlib)
python
from pathlib import Path # Python3.4+内置,替代os.path
# 创建路径对象
path = Path("data/user.csv")
# 判断路径是否存在
if path.exists():
print("路径存在")
# 拼接路径
new_path = Path("data") / "new_user.csv" # 更直观的拼接方式
print("拼接路径:", new_path)
# 创建目录
Path("new_dir").mkdir(exist_ok=True, parents=True) # parents=True支持多级目录
2. datetime模块计算指定日期是星期几
python
from datetime import datetime
date_str = "2024-05-20"
date_obj = datetime.strptime(date_str, "%Y-%m-%d")
# weekday():0=周一,6=周日;isoweekday():1=周一,7=周日
weekday = date_obj.weekday()
weekday_map = {0: "周一", 1: "周二", 2: "周三", 3: "周四", 4: "周五", 5: "周六", 6: "周日"}
print(f"{date_str} 是 {weekday_map[weekday]}")
3. 批量处理JSON文件(结合os.walk)
python
import os
import json
# 遍历目录下所有JSON文件,汇总数据
all_data = []
for root, dirs, files in os.walk("data_dir"):
for file in files:
if file.endswith(".json"):
file_path = os.path.join(root, file)
with open(file_path, "r", encoding="utf-8") as f:
data = json.load(f)
all_data.extend(data)
print(f"共汇总 {len(all_data)} 条数据")