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

Python基础教学:指定目录的遍历操作

我将为您介绍多种遍历目录的方法,每种方法都有不同的特点和适用场景。

方法1:使用 os.walk() (最常用)

importosdeftraverse_with_os_walk(root_dir):"""使用 os.walk() 遍历目录"""print(f"正在遍历目录:{root_dir}")print("-"*50)forroot,dirs,filesinos.walk(root_dir):# 当前目录的层级深度level=root.replace(root_dir,'').count(os.sep)indent=' '*2*levelprint(f"{indent}📁{os.path.basename(root)}/")# 打印子目录sub_indent=' '*2*(level+1)fordir_nameindirs:print(f"{sub_indent}📁{dir_name}/")# 打印文件forfile_nameinfiles:print(f"{sub_indent}📄{file_name}")# 使用示例if__name__=="__main__":target_dir=input("请输入要遍历的目录路径: ").strip()ifos.path.exists(target_dir):traverse_with_os_walk(target_dir)else:print("目录不存在!")

方法2:使用 pathlib.Path (面向对象方式)

frompathlibimportPathdeftraverse_with_pathlib(root_dir):"""使用 pathlib.Path 遍历目录"""root_path=Path(root_dir)defprint_tree(path,indent=0):"""递归打印目录树"""prefix=" "*indentifpath.is_dir():print(f"{prefix}📁{path.name}/")# 先列出子目录foriteminsorted(path.iterdir()):ifitem.is_dir():print_tree(item,indent+1)# 再列出文件foriteminsorted(path.iterdir()):ifitem.is_file():print(f"{prefix}📄{item.name}")else:print(f"{prefix}📄{path.name}")print_tree(root_path)# 使用示例if__name__=="__main__":target_dir=input("请输入要遍历的目录路径: ").strip()ifPath(target_dir).exists():traverse_with_pathlib(target_dir)else:print("目录不存在!")

方法3:使用 os.listdir() 递归遍历

importosdeftraverse_recursive(root_dir,level=0):"""递归遍历目录"""indent=" "*leveltry:items=os.listdir(root_dir)exceptPermissionError:print(f"{indent}❌ 无权限访问:{root_dir}")return# 分离目录和文件dirs=[]files=[]foriteminitems:item_path=os.path.join(root_dir,item)ifos.path.isdir(item_path):dirs.append(item)else:files.append(item)# 打印当前目录dir_name=os.path.basename(root_dir)iflevel>0elseroot_dirprint(f"{indent}📁{dir_name}/")# 打印子目录fordir_nameinsorted(dirs):dir_path=os.path.join(root_dir,dir_name)print(f"{indent}📁{dir_name}/")traverse_recursive(dir_path,level+2)# 打印文件forfile_nameinsorted(files):print(f"{indent}📄{file_name}")# 使用示例if__name__=="__main__":target_dir=input("请输入要遍历的目录路径: ").strip()ifos.path.exists(target_dir):traverse_recursive(target_dir)else:print("目录不存在!")

方法4:使用 glob 模块进行模式匹配遍历

importglobimportosdeftraverse_with_glob(root_dir,pattern="*"):"""使用 glob 模块遍历目录"""print(f"在目录 '{root_dir}' 中搜索模式 '{pattern}'")print("-"*50)# 递归搜索所有匹配的文件search_pattern=os.path.join(root_dir,"**",pattern)forfile_pathinglob.glob(search_pattern,recursive=True):ifos.path.isfile(file_path):# 计算相对路径relative_path=os.path.relpath(file_path,root_dir)file_size=os.path.getsize(file_path)print(f"📄{relative_path}({file_size}bytes)")# 使用示例if__name__=="__main__":target_dir=input("请输入要遍历的目录路径: ").strip()pattern=input("请输入文件模式 (例如: *.py, *.txt, 默认为 *): ").strip()or"*"ifos.path.exists(target_dir):traverse_with_glob(target_dir,pattern)else:print("目录不存在!")

方法5:带文件信息的详细遍历

importosimporttimefromdatetimeimportdatetimedeftraverse_with_details(root_dir):"""带详细信息的目录遍历"""print(f"详细文件列表 -{root_dir}")print("-"*80)print(f"{'类型':<6}{'名称':<30}{'大小':<10}{'修改时间':<20}")print("-"*80)forroot,dirs,filesinos.walk(root_dir):# 当前目录rel_path=os.path.relpath(root,root_dir)ifrel_path==".":display_path="."else:display_path=rel_pathprint(f"📁{display_path}/")# 子目录fordir_nameinsorted(dirs):dir_path=os.path.join(root,dir_name)print(f" 📁{dir_name}/")# 文件详细信息forfile_nameinsorted(files):file_path=os.path.join(root,file_name)try:# 文件大小file_size=os.path.getsize(file_path)size_str=f"{file_size}B"iffile_size<1024elsef"{file_size/1024:.1f}KB"# 修改时间mtime=os.path.getmtime(file_path)mtime_str=datetime.fromtimestamp(mtime).strftime("%Y-%m-%d %H:%M:%S")print(f" 📄{file_name:<28}{size_str:<10}{mtime_str}")exceptOSErrorase:print(f" ❌{file_name}- 错误:{e}")# 使用示例if__name__=="__main__":target_dir=input("请输入要遍历的目录路径: ").strip()ifos.path.exists(target_dir):traverse_with_details(target_dir)else:print("目录不存在!")

方法6:生成器方式的遍历(内存友好)

importosfrompathlibimportPathdeftraverse_generator(root_dir):"""使用生成器遍历目录,节省内存"""root_path=Path(root_dir)def_traverse(path):"""生成器函数"""ifpath.is_dir():yield('directory',path,None)foriteminpath.iterdir():yieldfrom_traverse(item)else:yield('file',path,path.stat().st_size)return_traverse(root_path)# 使用示例if__name__=="__main__":target_dir=input("请输入要遍历的目录路径: ").strip()ifnotos.path.exists(target_dir):print("目录不存在!")else:print(f"遍历结果 -{target_dir}")print("-"*50)foritem_type,path,sizeintraverse_generator(target_dir):rel_path=path.relative_to(target_dir)ifitem_type=='directory':print(f"📁{rel_path}/")else:print(f" 📄{rel_path}({size}bytes)")

综合示例:带过滤功能的遍历工具

importosfrompathlibimportPathclassDirectoryTraverser:"""目录遍历工具类"""def__init__(self,root_dir):self.root_dir=Path(root_dir)self.file_count=0self.dir_count=0deftraverse(self,show_hidden=False,file_ext=None,max_depth=None):"""遍历目录"""print(f"开始遍历:{self.root_dir}")print("-"*60)self._traverse_recursive(self.root_dir,show_hidden,file_ext,max_depth,0)print("-"*60)print(f"统计:{self.dir_count}个目录,{self.file_count}个文件")def_traverse_recursive(self,current_path,show_hidden,file_ext,max_depth,current_depth):"""递归遍历实现"""ifmax_depthandcurrent_depth>max_depth:returntry:items=list(current_path.iterdir())exceptPermissionError:print(" "*current_depth+f"❌ 无权限访问:{current_path}")return# 过滤隐藏文件ifnotshow_hidden:items=[itemforiteminitemsifnotitem.name.startswith('.')]# 分离目录和文件dirs=[itemforiteminitemsifitem.is_dir()]files=[itemforiteminitemsifitem.is_file()]# 文件扩展名过滤iffile_ext:files=[fforfinfilesiff.suffix.lower()==file_ext.lower()]# 打印当前目录indent=" "*current_depth rel_path=current_path.relative_to(self.root_dir)ifstr(rel_path)==".":print(f"{indent}📁{self.root_dir.name}/")else:print(f"{indent}📁{rel_path}/")self.dir_count+=1# 遍历子目录fordir_pathinsorted(dirs):self._traverse_recursive(dir_path,show_hidden,file_ext,max_depth,current_depth+1)# 打印文件forfile_pathinsorted(files):file_size=file_path.stat().st_size size_str=self._format_size(file_size)print(f"{indent}📄{file_path.name}({size_str})")self.file_count+=1def_format_size(self,size_bytes):"""格式化文件大小"""ifsize_bytes==0:return"0 B"size_names=["B","KB","MB","GB"]i=0whilesize_bytes>=1024andi<len(size_names)-1:size_bytes/=1024.0i+=1returnf"{size_bytes:.1f}{size_names[i]}"# 使用示例if__name__=="__main__":target_dir=input("请输入要遍历的目录路径: ").strip()ifnotos.path.exists(target_dir):print("目录不存在!")else:traverser=DirectoryTraverser(target_dir)show_hidden=input("显示隐藏文件? (y/n, 默认为 n): ").lower()=='y'file_ext=input("文件扩展名过滤 (例如: .py, .txt, 默认为空): ").strip()orNonemax_depth_input=input("最大深度 (默认为无限制): ").strip()max_depth=int(max_depth_input)ifmax_depth_input.isdigit()elseNonetraverser.traverse(show_hidden=show_hidden,file_ext=file_ext,max_depth=max_depth)

各种方法的比较

方法优点缺点适用场景
os.walk()简单易用,Python标准库不能控制遍历顺序大多数情况下的首选
pathlib.Path面向对象,代码清晰需要自己实现递归需要面向对象设计的项目
os.listdir()递归完全控制遍历逻辑代码相对复杂需要自定义遍历逻辑
glob支持模式匹配不适合复杂遍历需求文件搜索和模式匹配
生成器方式内存友好实现稍复杂处理大量文件时

选择哪种方法取决于您的具体需求:

  • 简单遍历:使用os.walk()
  • 需要面向对象:使用pathlib.Path
  • 需要模式匹配:使用glob
  • 大量文件处理:使用生成器方式
  • 需要详细信息:使用带文件信息的版本
http://www.rkmt.cn/news/1515298.html

相关文章:

  • AdS-Teo虫洞中的共形对称性与量子引力效应
  • 如何快速实现Unity高性能滚动列表:终极优化指南
  • 2026年网站定制开发公司靠谱吗,咨询00Cr25Ni20Mo2N尿素钢厂家哪家好 - mypinpai
  • 如何快速备份CSDN博客内容:面向技术博主的完整解决方案
  • Pintr核心功能揭秘:从照片到线条画的5步魔法
  • 从屏幕规格书到DTSI节点:手把手教你为RK3288/RK3399配置一块新MIPI屏
  • 纯自托管开源MLOps能否达到Level 2?金融级落地实践与避坑指南
  • 告别手动点点点:用CANoe的Trace窗口和IG模块高效排查汽车网络问题(实战案例解析)
  • CANN/cann-bench:Exp指数算子PyPTO基准测试
  • 2026毕业季|知网/维普新规后,公认靠谱的论文降重工具全攻略
  • macOS鼠标侧键魔法:三指滑动全局导航的终极免费方案
  • 时间序列三大基石:平稳性、自相关性与白噪声实战解析
  • 如何快速配置GitHub加速插件:面向开发者的完整指南
  • S_Tide工具箱避坑指南:搞定南海潮流椭圆绘制与潮汐预报的那些‘坑’
  • 停用词不是噪音,而是语义杠杆:Python五大库分层调控实战
  • 安全宣教培训PPT怎么做?从内容到设计手把手教你
  • 支招钢板租赁选购,口碑好的品牌企业有哪些 - mypinpai
  • Fiddler不止能抓包!这5个隐藏技巧,让你前端调试效率翻倍
  • 描述性分析实战:数据校准的七步工作法与业务洞察
  • 横向二级导航菜单HTML包:鼠标悬停即滑出子菜单,带jQuery平滑动画
  • 计算机毕业设计之书籍管理及推荐系统的设计与实现
  • CANN/asc-devkit CumSum样例
  • 多维聚合实战:超越GROUP BY的灵活分析架构设计
  • CANN/asc-devkit:DataCopy伴随原子操作样例
  • 微信投票小程序制作全攻略,云帆投票+西瓜评选+腾讯投票,2026 朋友圈发起投票实测指南 - 投票小程序
  • 2026年 氯酸钠供应厂家:高纯度/工业级/水处理用氯酸钠优质源头企业 - 品牌发掘
  • Udacity AWS机器学习奖学金全流程实战指南
  • Python图像差异检测:像素比对、SSIM、特征匹配与色彩分析四法实战
  • 深度测评:2026年真正好用的专业一键生成论文工具
  • 模板驱动型文档自动化:零代码实现结构化内容复用与动态生成