当前位置: 首页 > news >正文

寒假学习笔记2.4

一、实践练习
练习1:文件整理脚本
编写一个脚本,将指定目录下的文件按扩展名分类到不同的文件夹中。

python
import os
import shutil
from pathlib import Path

def organize_files(directory):
"""按扩展名整理文件"""
dir_path = Path(directory)
if not dir_path.exists() or not dir_path.is_dir():
print(f"目录 {directory} 不存在")
return

for file in dir_path.iterdir():if file.is_file():# 获取扩展名(去掉点,转为小写)ext = file.suffix.lower().lstrip('.')if not ext:  # 无扩展名的文件放到 'no_extension' 文件夹ext = 'no_extension'# 创建目标文件夹target_dir = dir_path / exttarget_dir.mkdir(exist_ok=True)# 移动文件target_path = target_dir / file.nameif not target_path.exists():  # 避免覆盖同名文件shutil.move(str(file), str(target_path))print(f"移动 {file.name} -> {ext}/")else:print(f"跳过 {file.name},目标文件已存在")print("整理完成!")

if name == "main":
import sys
if len(sys.argv) > 1:
organize_files(sys.argv[1])
else:
organize_files('.')
练习2:日期计算器
编写一个交互式日期计算器,可以计算两个日期之差、日期加减天数、判断闰年等。

python
import datetime

def date_calculator():
print("=== 日期计算器 ===")
while True:
print("\n1. 计算两个日期之差")
print("2. 日期加减天数")
print("3. 判断闰年")
print("4. 退出")
choice = input("请选择:")

    if choice == '1':date1_str = input("输入第一个日期 (YYYY-MM-DD):")date2_str = input("输入第二个日期 (YYYY-MM-DD):")try:d1 = datetime.datetime.strptime(date1_str, "%Y-%m-%d").date()d2 = datetime.datetime.strptime(date2_str, "%Y-%m-%d").date()delta = abs(d2 - d1)print(f"相差 {delta.days} 天")except ValueError:print("日期格式错误!")elif choice == '2':date_str = input("输入基准日期 (YYYY-MM-DD):")days = input("输入天数(正数为加,负数为减):")try:d = datetime.datetime.strptime(date_str, "%Y-%m-%d").date()days_int = int(days)result = d + datetime.timedelta(days=days_int)print(f"结果日期:{result}")except ValueError:print("输入错误!")elif choice == '3':year = input("输入年份:")try:year = int(year)is_leap = (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)print(f"{year}年{'是' if is_leap else '不是'}闰年")except ValueError:print("年份必须为整数!")elif choice == '4':break

if name == "main":
date_calculator()
练习3:随机密码生成器
生成指定长度和复杂度的随机密码。

python
import random
import string

def generate_password(length=12, use_digits=True, use_punctuation=True):
"""生成随机密码"""
characters = string.ascii_letters # 大小写字母
if use_digits:
characters += string.digits
if use_punctuation:
characters += string.punctuation

if not characters:return "错误:没有可用的字符集"password = ''.join(random.choice(characters) for _ in range(length))
return password

def main():
print("=== 随机密码生成器 ===")
length = int(input("密码长度 (默认12):") or 12)
use_digits = input("包含数字?(y/n, 默认y):").lower() != 'n'
use_punct = input("包含符号?(y/n, 默认y):").lower() != 'n'

for i in range(5):pwd = generate_password(length, use_digits, use_punct)print(f"密码 {i+1}: {pwd}")

if name == "main":
main()
练习4:批量重命名工具
将指定目录下的所有文件按规则重命名(如添加前缀、替换字符串等)。

python
import os
from pathlib import Path

def batch_rename(directory, prefix="", suffix="", find="", replace=""):
"""批量重命名文件
directory: 目录
prefix: 添加前缀
suffix: 添加后缀(在扩展名前)
find: 需要替换的字符串
replace: 替换后的字符串
"""
dir_path = Path(directory)
if not dir_path.exists():
print("目录不存在")
return

for file in dir_path.iterdir():if file.is_file():old_name = file.namenew_name = old_name# 替换操作if find:new_name = new_name.replace(find, replace)# 分离文件名和扩展名stem = file.stemsuffix_ext = file.suffix# 添加前缀和后缀new_stem = prefix + stem + suffixnew_name = new_stem + suffix_extif new_name != old_name:new_path = file.with_name(new_name)if not new_path.exists():file.rename(new_path)print(f"{old_name} -> {new_name}")else:print(f"跳过 {old_name},目标文件 {new_name} 已存在")

if name == "main":
import sys
if len(sys.argv) > 1:
dir_path = sys.argv[1]
else:
dir_path = input("请输入目录路径:")
print("批量重命名工具")
prefix = input("添加前缀(留空无):")
suffix = input("添加后缀(在扩展名前,留空无):")
find = input("查找字符串(留空无):")
replace = input("替换为(留空无):")
batch_rename(dir_path, prefix, suffix, find, replace)
四、遇到的问题与解决
问题:os.makedirs和Path.mkdir(parents=True)的区别

解决:两者功能类似,pathlib方法更面向对象,且exist_ok=True可以避免目录已存在时报错

问题:shutil.move移动文件时跨磁盘分区会复制再删除,速度慢

解决:可以使用shutil.move内部处理,无需担心,但如果需要大量移动,可先复制再删除

问题:datetime.datetime.strptime解析错误时抛出ValueError

解决:使用try-except捕获,提示用户重新输入

问题:random.shuffle只能用于可变序列,不能用于元组

解决:转换为列表再打乱

问题:pathlib的/运算符要求左边是Path对象,右边是字符串或另一个Path

解决:确保左侧是Path,如 Path('dir') / 'file.txt'

二、学习总结
Python标准库提供了丰富的模块,大大扩展了语言的功能

os和pathlib都可以进行文件和目录操作,pathlib更现代、更直观

sys模块可以获取命令行参数、解释器信息等,常用于脚本开发

datetime模块让日期时间处理变得简单,特别是timedelta和格式化

random模块可用于模拟、游戏、密码生成等场景

math模块提供了常用的数学函数和常量

通过综合运用标准库,可以快速开发实用的小工具,提高工作效率

http://www.jsqmd.com/news/390403/

相关文章:

  • 存在即对话:方见华对话本体论与世毫九理论的数学奠基、形式证明与工程实现
  • 寒假学习笔记2.3
  • 摩尔线程快速完成对Qwen3.5模型全面适配
  • 如何通过数据分析实现精准营销
  • 20260217
  • Ubuntu 上 ROS2 的安装
  • 协同过滤算法Nodejs+vue3的短视频分享网站系统
  • vcpkg的配置
  • 寒假学习笔记2.2
  • 状压+dijk |floyd
  • 寒假学习笔记2.1
  • 并查集 - ## Find them, Catch them
  • (3-2)机器人身体结构与人体仿生学:人形机器人躯干体系
  • 气泡图标注软件中文版(美式功能设计)|一键插入序号气泡图,支持CAD/PDF/图片+OCR识别+Excel报告导出
  • EncodeConvert编码转换器v2.0——高效支持GBK与UTF-8互转的汉字编码工具
  • ZProtect一机一码工具(电脑版):专为DLL/EXE文件设计的轻量级软件开发解决方案
  • 未来之窗昭和仙君(七十二)前端交互异常行为检测—东方仙盟练气
  • 冥想第一千七百九十七天(1797)
  • 冥想第一千七百九十六天(1796)
  • ROS快速入门教程:什么是SLAM(Simultaneous localization and mapping,同步定位与建图)【解决机器人在未知环境运动时的定位与地图构建问题】
  • OpenTelemetry 开发实战【左扬精讲】—— 云原生可观测体系构建与分布式追踪二次开发
  • 工业园区全域轨迹拼接与异常行为智能识别平台——跨摄像单元轨迹连续性校验 × 多帧误差补偿引擎
  • Agentic AI时代,提示工程架构师的核心竞争力是什么?
  • 如何提升企业品牌在豆包结果中的排名? - 品牌2025
  • 寒假19
  • VSCode 配置 MinGW 搭建 C++ 开发环境
  • 基于SSM的蛋糕私人订制网站[SSM]-计算机毕业设计源码+LW文档
  • 领略大数据领域数据科学的数据清洗技巧
  • Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 4 —— 基于 Operator 实现大模型私有化部署与管理
  • 基于SSM的传智健康系统[SSM]-计算机毕业设计源码+LW文档