Python遍历文件夹的两种方法比较

本文对比了使用os.walk和os.listdir两种方法遍历文件夹的区别,并提供了代码示例。os.walk能递归地列出所有子目录及文件,而os.listdir则按字母顺序输出目录树。此外,还提供了一个将指定目录下的所有.ppm文件转换为.jpg文件的实用脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python遍历文件夹的两种方法比较

转自:点击打开链接

遍历文件夹是一个很常用的功能吧。这里分别用两种方法实现: 

第一种:使用os.walk:

# -*- coding: utf-8 -*- 
import os 
def Test1(rootDir): 
    list_dirs = os.walk(rootDir) 
    for root, dirs, files in list_dirs: 
        for d in dirs: 
            print os.path.join(root, d)      
        for f in files: 
            print os.path.join(root, f)
第二种:使用os.listdir:

# -*- coding: utf-8 -*- 
import os 
def Test2(rootDir): 
    for lists in os.listdir(rootDir): 
        path = os.path.join(rootDir, lists) 
        print path 
        if os.path.isdir(path): 
            Test2(path) 

这两种到底有什么区别呢?

这里先建立一个测试目录E:\test,目录结构如下:

E:\TEST 
│--A 
│  │--A-A 
│  │  │--A-A-A.txt 
│  │--A-B.txt 
│  │--A-C 
│  │  │--A-B-A.txt 
│  │--A-D.txt 
│--B.txt 
│--C 
│  │--C-A.txt 
│  │--C-B.txt 
│--D.txt 
│--E 

下面通过运行如下代码:

Test1('E:\TEST') 
print '=======================================' 
Test2('E:\TEST') 

输出结果为:
>>>  
E:\TEST\A 
E:\TEST\C 
E:\TEST\E 
E:\TEST\B.txt 
E:\TEST\D.txt 
E:\TEST\A\A-A 
E:\TEST\A\A-C 
E:\TEST\A\A-B.txt 
E:\TEST\A\A-D.txt 
E:\TEST\A\A-A\A-A-A.txt 
E:\TEST\A\A-C\A-B-A.txt 
E:\TEST\C\C-A.txt 
E:\TEST\C\C-B.txt 
======================================= 
E:\TEST\A 
E:\TEST\A\A-A 
E:\TEST\A\A-A\A-A-A.txt 
E:\TEST\A\A-B.txt 
E:\TEST\A\A-C 
E:\TEST\A\A-C\A-B-A.txt 
E:\TEST\A\A-D.txt 
E:\TEST\B.txt 
E:\TEST\C 
E:\TEST\C\C-A.txt 
E:\TEST\C\C-B.txt 
E:\TEST\D.txt 
E:\TEST\E 
>>>  
可以看出,对于第一种方法,输出总是先文件夹后文件名的,对于第二种,则是按照目录树结构以及按照首字母排序进行输出的。


补充加入:对某目录下(包括子目录)的所有.ppm文件改为.jpg文件。

from PIL import Image
import os
import os.path

def change_format(rootDir):
	for root, dirs, files in os.walk(rootDir):
		for file in files:
			if os.path.splitext(file)[1] == '.ppm':
				im = Image.open(os.path.join(root, file))
				filename = os.path.join(root, file)
				im.save(os.path.splitext(filename)[0] + '.jpg', 'JPEG')

if __name__ == '__main__':
	_dir = "your directory"
	change_format(_dir)

root 为 path(一直到file名字(除去文件名字)),file只是文件名字加上扩展名
此处os.path.join(root,file)为absolute path,os.path.splitext(file)[1]为扩展名( os.path.splitext(file)[1][1:]为ppm不带.)os.path.splitext(file)[0]为文件名



### 使用 Python 遍历文件夹并读取文件 在 Python 中,可以使用 `os` 模块中的 `os.walk()` 方法或者更现代的 `pathlib` 模块来实现遍历文件夹的功能。以下是两种方法的具体说明: #### 利用 `os.walk()` 实现目录遍历 `os.walk()` 是一种简单而强大的工具,用于生成指定目录下的文件名列表。它会返回一个三元组 `(dirpath, dirnames, filenames)`,分别表示当前路径、子目录名称和文件名称。 ```python import os for root, dirs, files in os.walk("your_directory_path"): for file in files: file_path = os.path.join(root, file) with open(file_path, 'r', encoding='utf-8') as f: content = f.read() print(f"File {file} contains:\n{content}") ``` 上述代码通过 `os.walk()` 遍历目标目录及其所有子目录,并逐一打开每个文件进行读取[^1]。 #### 借助 `pathlib.Path()` 进行操作 相较于传统的 `os` 模块,`pathlib` 提供了一种面向对象的方式来处理文件系统路径。它可以轻松地获取特定类型的文件或递归访问整个目录树。 ```python from pathlib import Path directory = Path("your_directory_path") for filepath in directory.rglob('*'): # rglob supports recursive search. if filepath.is_file(): with filepath.open('r', encoding='utf-8') as file: data = file.read() print(f"{filepath.name}'s contents are:\n{data}") ``` 这段脚本利用了 `Path().rglob()` 函数来进行全局匹配模式搜索,从而找到所有的文件项。 这两种方式各有优劣,在实际开发过程中可以根据个人习惯以及项目需求选择合适的方法完成任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值