9.2 遍历目录树

假定你希望对某个文件夹中的所有文件改名,包括该文件夹中所有子文件夹中的所有文件。也就是说,你希望遍历目录树,处理遇到的每个文件。写程序完成这件事,可能需要一些技巧。好在,Python 
提供了一个函数,替你处理这个过程。
请看C:\delicious 文件夹及其内容,如图 9-1 所示。

 


图 9-1    一个示例文件夹,包含 3 个文件夹和 4 个文件

这里有一个例子程序,针对图 9-1 的目录树,使用了 os.walk()函数:
import  os

for  folderName,  subfolders,  filenames  in  os.walk('C:\\delicious'):


print('The  current  folder  is  '  +  folderName) for  subfolder  in  subfolders:
print('SUBFOLDER  OF  '  +  folderName  +  ':  '  +  subfolder) for  filename  in  filenames:
print('FILE  INSIDE  '  +  folderName  +  ':  '+  filename) print('')
os.walk()函数被传入一个字符串值,即一个文件夹的路径。你可以在一个 for
循环语句中使用 os.walk()函数,遍历目录树,就像使用 range()函数遍历一个范围的数字一样。不像 range(),os.walk()在循环的每次迭代中,返回 3 个值:
1.当前文件夹名称的字符串。
2.当前文件夹中子文件夹的字符串的列表。
3.当前文件夹中文件的字符串的列表。
所谓当前文件夹,是指 for 循环当前迭代的文件夹。程序的当前工作目录,不会因为 os.walk()而改变。
就像你可以在代码 for i in range(10):中选择变量名称 i 一样,你也可以选择前面列出来的 3 个字的变量名称。我通常使用 foldername、subfolders 和 
filenames。
运行该程序,它的输出如下:
The  current  folder  is  C:\delicious SUBFOLDER  OF  C:\delicious:  cats SUBFOLDER  OF  
C:\delicious:  walnut FILE  INSIDE  C:\delicious:  spam.txt

The  current  folder  is  C:\delicious\cats FILE  INSIDE  C:\delicious\cats:  catnames.txt FILE  
INSIDE  C:\delicious\cats:  zophie.jpg

The  current  folder  is  C:\delicious\walnut SUBFOLDER  OF  C:\delicious\walnut:  waffles

The  current  folder  is  C:\delicious\walnut\waffles FILE  INSIDE  C:\delicious\walnut\waffles:  
butter.txt.
因为 os.walk()返回字符串的列表,保存在 subfolder 和 filename 变量中,所以你可以在它们自己的 for  循环中使用这些列表。用你自己定制的代码,取代 
print()函数调用(或者如果不需要,就删除 for 循环)。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
目的: 掌握与文件和目录有关的系统调用和库函数。 要求: 1、编写程序myfind 命令语法: myfind <pathname> [-comp <filename> | -name <str>…] 命令语义: (1)myfind <pathname> 的功能: 除了具有与程序4-7相同的功能外,还要输出在<pathname>目录之下,文件长度不大于4096字节的常规文件,在所有允许访问的普通文件中所占的百分比。程序不允许打印出任何路径名。 (2)myfind <pathname> -comp <filename>的功能: <filename>是常规文件的路径名(非目录名,但是其路径可以包含目录)。命令仅仅输出在<pathname>目录之下,所有与<filename>文件内容一致的文件的绝对路径名。不允许输出任何其它的路径名,包括不可访问的路径名。 (3)myfind <pathname> -name <str>…的功能: <str>…是一个以空格分隔的文件名序列(不带路径)。命令输出在<pathname>目录之下,所有与<str>…序列中文件名相同的文件的绝对路径名。不允许输出不可访问的或无关的路径名。 <pathname>和<filename>均既可以是绝对路径名,也可以是相对路径名。<pathname>既可以是目录,也可以是文件,此时,目录为当前工作目录。 2、注意尽可能地提高程序的效率。注意避免因打开太多文件而产生的错误。 3、遍历目录时,访问结点(目录项)的具体操作应当由遍历函数dopath携带的函数指针参数决定。这样程序的结构清晰,可扩充性好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大飞哥软件自习室

希望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值