os.walk()方法

os.sep 获取目录分隔符

=================================================================

os.makedirs() os.removedirs()

os.makedirs()函数用于创建上下级关联的目录、子目录,类似于linux命令 mkdir -p a/b/c。例如os.makedirs("a/b/c")的结果:


与os.makedirs()对应的是os.removedirs()函数,用于删除 空的目录。os.removedirs("a/b/c")即可删除 空的目录.例如 a/b/c  a目录非空,b、c目录均为空,则removedirs可以同时删除b/c目录

如果要删除非空的目录,可以使用shutil模块,shutil.rmtree("a")即可强制删除目录a

===================================================================


#coding:utf-8

import os
def main():
    '''
    root 是起始路径,且是绝对路径
    dirs 起始路径下的目录列表
    files 起始路径下的文件列表
    '''
    for root,dirs,files in os.walk(r'g:'):

        for f in files:
            print '*'*10,root,'*'*10
            print os.path.join(root,f)

if __name__ == '__main__':
    main()

部分结果:

********** g: **********
g:模块5.py
********** g: **********
g:空行输出特殊字符.py
********** g:$RECYCLE.BIN\S-1-5-21-2589521740-3335953511-3928509256-1000 **********
g:$RECYCLE.BIN\S-1-5-21-2589521740-3335953511-3928509256-1000\desktop.ini
********** g:1 **********
g:1\a.a
********** g:1 **********
g:1\aa.aa
********** g:1 **********
g:1\新建文本文档.txt
********** g:1 **********
g:1\齐秦-原来的我.MP3
********** g:auto **********
g:auto\auto.py
********** g:auto **********
g:auto\auto_suit.py
********** g:auto **********
g:auto\dynamic.py


今天第一次进行 文件遍历,自己递归写的时候还调试了好久,(主要因为分隔符号的问题),后来发现了os.walk方法,就忍不住和大家分享下.


先看下代码:



import os

for i in os.walk('c:'+os.sep+'ant'):
    print i[1]



下面是输出:

c:\ant
c:\ant\bin
c:\ant\docs
c:\ant\docs\ant2
c:\ant\docs\antlibs
c:\ant\docs\antlibs\antunit
c:\ant\docs\antlibs\compress
c:\ant\docs\antlibs\dotnet
c:\ant\docs\antlibs\props
c:\ant\docs\antlibs\svn
c:\ant\docs\images
c:\ant\docs\manual
c:\ant\docs\manual\api
c:\ant\docs\manual\api\org
c:\ant\docs\manual\api\org\apache
c:\ant\docs\manual\api\org\apache\tools
c:\ant\docs\manual\api\org\apache\tools\ant
c:\ant\docs\manual\api\org\apache\tools\ant\dispatch
c:\ant\docs\manual\api\org\apache\tools\ant\filters


后面还有很长.

如果不使用这个方法,遍历同样能达到效果.不过使用 os.walk 方便很多了.这个方法返回的是一个三元tupple(dirpath, dirnames, filenames),

递归遍历给定目录下的内容。(路径、路径下的文件夹、路径下的文件)

其中第一个为起始路径,(起始路径是绝对路径)

第二个为起始路径下的文件夹列表,

第三个是起始路径下的文件列表.

dirpath是一个string,代表目录的路径,

dirnames是一个list,包含了dirpath下所有子目录的名字,

filenames是一个list,包含了非目录文件的名字.这些名字不包含路径信息,如果需要得到全路径,需要使用 os.path.join(dirpath, name).



下面是可以看到 os.walk 方法返回的内容.


代码:


import os

for i in os.walk('c:'+os.sep+'ant'):
    print i
   

输出:

('c:\\ant', ['bin', 'docs', 'etc', 'lib', 'Project'], ['fetch.xml', 'get-m2.xml', 'INSTALL', 'KEYS', 'LICENSE', 'NOTICE', 'README', 'WHATSNEW'])
('c:\\ant\\bin', [], ['ant', 'ant.bat', 'ant.cmd', 'antenv.cmd', 'antRun', 'antRun.bat', 'antRun.pl', 'complete-ant-cmd.pl', 'envset.cmd', 'lcp.bat', 'runant.pl', 'runant.py', 'runrc.cmd'])
('c:\\ant\\docs', ['ant2', 'antlibs', 'images', 'manual', 'projects', 'slides', 'webtest'], ['antnews.html', 'ant_in_anger.html', 'ant_task_guidelines.html', 'appendix_e.pdf', 'breadcrumbs.js', 'bugs.html', 'bylaws.html', 'contributors.html', 'external.html', 'faq.html', 'favicon.ico', 'index.html', 'legal.html', 'LICENSE', 'license.html', 'mail.html', 'mission.html', 'nightlies.html', 'page.css', 'problems.html', 'projects.html', 'resources.html', 'svn.html'])
('c:\\ant\\docs\\ant2', [], ['actionlist.html', 'features.html', 'FunctionalRequirements.html', 'original-specification.html', 'requested-features.html', 'requested-features.txt', 'VFS.txt'])
('c:\\ant\\docs\\antlibs', ['antunit', 'compress', 'dotnet', 'props', 'svn'], ['bindownload.cgi', 'bindownload.html', 'charter.html', 'index.html', 'proper.html', 'sandbox.html', 'srcdownload.cgi', 'srcdownload.html'])
('c:\\ant\\docs\\antlibs\\antunit', [], ['index.html'])
('c:\\ant\\docs\\antlibs\\compress', [], ['index.html'])
('c:\\ant\\docs\\antlibs\\dotnet', [], ['index.html'])
('c:\\ant\\docs\\antlibs\\props', [], ['index.html'])

...


当然后面还有很长了.


有了这个函数无论是遍历文件夹,还是遍历文件都很方便.



下面是我是自己用递归实现的遍历文件方法.

代码:

def listdir(leval,path):
    for i in os.listdir(path):
        print('|  '*(leval + 1) + i)
        if os.path.isdir(path+i):
            listdir(leval+1, path+i)

path = 'c:'+os.sep+'ant'

#或者直接 path='C:/ant'
print(path+os.sep)
listdir(0, path+os.sep)


下面是输出:

c:\ant\
|  bin
|  |  ant
|  |  ant.bat
|  |  ant.cmd
|  |  antenv.cmd
|  |  antRun
|  |  antRun.bat
|  |  antRun.pl
|  |  complete-ant-cmd.pl
|  |  envset.cmd
|  |  lcp.bat
|  |  runant.pl
|  |  runant.py
|  |  runrc.cmd
|  docs
|  |  ant2
|  |  antlibs
|  |  antnews.html
|  |  ant_in_anger.html
|  |  ant_task_guidelines.html
|  |  appendix_e.pdf
|  |  breadcrumbs.js
|  |  bugs.html
|  |  bylaws.html
|  |  contributors.html
|  |  external.html
|  |  faq.html
|  |  favicon.ico
|  |  images
|  |  index.html
|  |  legal.html
|  |  LICENSE
|  |  license.html
|  |  mail.html
|  |  manual
|  |  mission.html
|  |  nightlies.html
|  |  page.css
|  |  problems.html
|  |  projects
|  |  projects.html
|  |  resources.html
|  |  slides
<think>首先,用户的问题是关于Python中os.walk方法的作用。系统指令要求使用中文回答,并遵循特定的格式规则:行内数学表达式用$...$,独立公式用$$...$$,但这里没有数学内容,所以我可以忽略数学部分。 用户提供了几个引用: - 引用[1]: 提到os.walk()方法的使用示例。 - 引用[2]: 强调了对os.listdir()os.walk()的理解,选择合适方法提高效率。 - 引用[3]: 描述了os.walk()遍历目录结构,包括topdown参数为False时的示例。 - 引用[4]: 解释了topdown参数的作用。 用户说:“上述引用仅供参考,并不是用户真正的需求”,并指示参考上一次的问题和我的回答。查看上下文,这是初始交互,没有上一次回答。用户明确说:“我想了解Python中os.walk方法的作用”,所以焦点是解释os.walk的作用。 系统指令还包括生成相关问题。在示例中,它是在回答后添加“§§相关问题§§”部分。 回答结构:应该清晰、逐步,确保真实可靠。既然是关于编程方法,我可以: 1. 简要介绍os.walk。 2. 解释其作用。 3. 给出一个简单示例。 4. 引用提供的引用来支持答案。 5. 最后添加相关问题。 引用需要自然地添加到段落末尾。例如,在解释时,引用相关部分。 关键点: - os.walk() 用于遍历目录树。 - 它返回一个生成器,产生元组(root, dirs, files)。 - root 是当前目录路径。 - dirs 是子目录列表。 - files 是文件列表。 - topdown 参数控制遍历顺序:True(默认)优先遍历当前目录再子目录;False 则相反。 从引用中提取: - [1]: 有示例代码。 - [2]: 强调效率和选择。 - [3]: 示例和topdown=False。 - [4]: 解释topdown。 在回答中,我可以整合这些: - 先用中文解释作用。 - 然后给出一个代码示例。 - 提到topdown参数。 - 引用引用。 最后,生成相关问题: - 类似示例,列出几个问题。 完整回答结构: 1. 开头解释os.walk的作用。 2. 详细描述。 3. 提供一个示例代码。 4. 讨论可选参数如topdown。 5. 自然地添加引用标识。 6. 结束时有相关问题部分。 使用中文回答。 最终输出: - 回答部分。 - §§相关问题§§ - 列出问题。 </think>### Python os.walk() 方法的作用 在 Python 中,`os.walk()` 方法是一个用于遍历目录树的高效工具。它属于 `os` 模块,主要作用是递归地遍历指定目录及其所有子目录,并返回一个生成器(generator)。该方法会生成三元组 `(root, dirs, files)`,其中: - `root`:当前正在遍历的目录的路径(字符串)。 - `dirs`:当前目录下的子目录名称列表(列表类型)。 - `files`:当前目录下的文件名列表(列表类型)。 通过这种方式,`os.walk()` 让你能够轻松地访问目录结构中的每个文件和文件夹,常用于文件搜索、数据清理、目录备份等任务。例如,你可以用它来查找所有特定扩展名的文件或统计文件夹大小[^1]。 #### 关键作用总结: 1. **递归遍历**:自动处理目录的嵌套结构,无需手动编写递归代码。 2. **灵活性**:提供对当前目录、子目录和文件的直接访问,便于过滤或处理数据。 3. **效率优势**:相比于手动使用 `os.listdir()` 和递归调用,`os.walk()` 更简洁高效,尤其适合大型目录树[^2]。 #### 可选参数:`topdown` `os.walk()` 支持 `topdown` 参数(默认为 `True`),它控制遍历顺序: - 当 `topdown=True`:优先遍历当前目录(root),然后遍历子目录(dirs)[^4]。这是默认行为,适用于需要先处理父目录的场景。 - 当 `topdown=False`:优先遍历子目录(dirs),再处理当前目录。这在需要“深度优先”遍历时很有用,比如从叶子节点开始处理[^3]。 #### 简单代码示例 以下是一个使用 `os.walk()` 的 Python 示例,遍历当前目录并打印所有文件和子目录的路径。注意 `topdown=False` 的设置: ```python import os # 遍历当前目录(topdown=False 表示优先遍历子目录) for root, dirs, files in os.walk(".", topdown=False): for name in files: # 处理文件 print(os.path.join(root, name)) for name in dirs: # 处理子目录 print(os.path.join(root, name)) ``` 在这个例子中: - `os.walk(".", topdown=False)` 从当前目录开始遍历。 - 循环依次输出每个文件路径和子目录路径。你可以根据需要添加过滤逻辑(如只查找 `.txt` 文件)[^1][^3]。 这个方法在文件系统操作中非常实用,能显著简化代码并提高可读性[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值