Python常用内置模块教程:os/sys/datetime/random/json全解析

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)} 条数据")
相关推荐
努力的小帅1 小时前
Python_OpenCV入门到精通——入门篇(看这一篇就足够了!!!)
图像处理·python·opencv·计算机视觉·视觉检测·视觉项目
z***89711 小时前
Flask框架中SQLAlchemy的使用方法
后端·python·flask
G果1 小时前
ROS2 Cartographer纯定位导航遇到的问题
python·ros2·定位·cartographer·导航·launch·navigation2
Brduino脑机接口技术答疑2 小时前
脑机接口数据处理连载(二) 数据源头解析:脑电信号的采集原理与数据特性
人工智能·python·算法·数据分析·脑机接口
Wise玩转AI2 小时前
Day 25|智能体的“可观察性(Observability)体系”
人工智能·python·ai·chatgpt·ai智能体
p***92482 小时前
Python使用PyMySQL操作MySQL完整指南
数据库·python·mysql
kali-Myon2 小时前
NewStarCTF2025-Week5-Web
java·python·安全·web安全·php·web·ctf
DFT计算杂谈2 小时前
Abinit-10.4.7安装教程
linux·数据库·python·算法·matlab
肖永威3 小时前
VSCode调试Python命令行输入参数程序argparse模块实践
vscode·python