python循环遍历文件夹(python中for循环遍历文件)
如何利用Python遍历文件夹
1. 基本实现
[root@localhost ~]# cat dirfile.py
import os
path='/tmp'for dirpath,dirnames,filenames in os.walk(path): ? ?for file in filenames:
fullpath=os.path.join(dirpath,file) ? ? ? ? ? ?print fullpath
执行结果如下:
[root@localhost ~]# python dirfile.py
/tmp/yum.log/tmp/pulse-3QSA3BbwpQ49/pid/tmp/pulse-3QSA3BbwpQ49/native/tmp/.esd-0/socket
2. 在上例的基础上传递参数
import os,sys
path=sys.argv[1]for dirpath,dirnames,filenames in os.walk(path): ? ?for file in filenames:
fullpath=os.path.join(dirpath,file) ? ? ? ? ? ?print fullpath
执行方式为:[root@localhost ~]# python dirfile.py /tmp
在这里,sys.argv[1]是接受参数,也可以定义sys.argv[2]接受第二个参数
3. 如何用函数实现
import os,sys
path='/tmp'def paths(path):
path_collection=[] ? ? ? ?for dirpath,dirnames,filenames in os.walk(path): ? ? ? ? ? ? ? ?for file in filenames:
fullpath=os.path.join(dirpath,file)
path_collection.append(fullpath) ? ? ? ?return path_collectionfor file in paths(path): ? ? ? ?print file
4. 如何封装成类
import os,sysclass diskwalk(object): ? ? ? ?def __init__(self,path):
self.path = path ? ? ? ?def paths(self):
path=self.path
path_collection=[] ? ? ? ? ? ? ? ?for dirpath,dirnames,filenames in os.walk(path): ? ? ? ? ? ? ? ? ? ? ? ?for file in filenames:
fullpath=os.path.join(dirpath,file)
path_collection.append(fullpath) ? ? ? ? ? ? ? ?return path_collectionif __name__ == '__main__': ? ? ? ?for file in diskwalk(sys.argv[1]).paths(): ? ? ? ? ? ? ? ?print file
PS:
1 def __init__():函数,也叫初始化函数。
self.path = path可以理解为初始化定义了1个变量。 在后面的def里面调用的时候必须要使用self.path而不能使用path
2?__name__ == '__main__'
模块是对象,并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但是您也可以像一个标准的程序样直接运行模块,在这种情况下, __name__ 的值将是一个特别缺省"__main__"。上述类中加上__name__ == '__main__'的判断语句,可以直接在终端环境下执行python dirfile.py /tmp进行测试,不必非得在交互式环境下导入模块进行测试。
python遍历目录就是这么简单
有时我们有列出目录下都有哪些文件和子目录的需求,这种情况是有现成命令可用的,比如windows下的dir命令,linux下的ls命令都可以,那我们用python代码怎么实现呢?
我们利用python丰富的库很容易就能实现一个简易版本,下面我们就用4种方法来实现它。
一、使用os.popen
os.popen工作原理是新建一个子进程,然后用这个子进程执行命令,父进程与子进程间通过管道进行通信。
根据调用popen时的传参,我们可以通过管道读取子进程的输出也可以向子进程写数据,默认是读取子进程的输出。
从以上描述可以看出popen是非常通用的,不是只能用于我们这个例子哦。
那我们开始用它实现我们的需求吧,代码如下:
哈哈,是不是很简单,这种方式虽然能达到目的但其实并不是我们想要的,我们本来就是要实现ls的,结果调用了ls,所以严格意义上来说我们并没有实现ls,那让我们继续往下看其它方法吧,嘿嘿。
二、使用glob.glob
glob可以根据你使用的通配符对文件进行匹配,利用这个特性我们可以列出当前目录下都有哪些文件和子目录,如下代码:
三、使用os.listdir
os.listdir同样可以列出某个目录下都有哪些文件和子目录,如下代码:
四、使用os.walk
os.walk在遍历目录方面非常强大,它不但可以遍历你需要的目录,也可以递归遍历子目录且递归的深度可以用代码控制,下面让我们分别看下怎么遍历整个目录树以及怎么控制深度吧。
os.walk默认是遍历整个目录树的,如下代码就会递归打印出当前目录下所有文件:
那我们怎么控制遍历的深度,比如只遍历n层呢?其实很简单,只需要定义一个深度变量,然后到达n后跳出循环即可,如下代码就只遍历1层:
至此我们已经写完4种方法了,如果你还有其他方法,欢迎评论交流。
Python中如何遍历指定目录下的所有文件?
例如:在C:\TDDOWNLOAD目录下有a.txt、b.txt两个文件,另有\sub1子文件夹,C:\TDDOWNLOAD\sub1下又有c.txt、d.txt两个文件。
1.
os.walk
os.walk()返回一个三元素的tuple:当前路径、子文件夹名称、文件列表。
import
os
def
fun(
path
):...
for
root,
dirs,
files
in
os.walk(
path
):...
for
fn
in
files:...
root,
fn...
fun(
r'C:\TDDOWNLOAD'
)C:\TDDOWNLOAD
a.txtC:\TDDOWNLOAD
b.txtC:\TDDOWNLOAD\sub1
c.txtC:\TDDOWNLOAD\sub1
d.txt
2.
glob.glob
glob.glob()只接受一个参数,这个参数既代有路径,又代有匹配模式,返回值为一个列表。注意,glob.glob()无法直接穿透子文件夹,需要自己处理:
def
fun(
path
):...
for
fn
in
glob.glob(
path
+
os.sep
+
'*'
):
#
'*'代表匹配所有文件...
if
os.path.isdir(
fn
):
#
如果结果为文件夹...
fun(
fn
)
#
递归...
else:...
fn...
fun(
r'C:\TDDOWNLOAD'
)C:\TDDOWNLOAD\a.txtC:\TDDOWNLOAD\b.txtC:\TDDOWNLOAD\sub1\c.txtC:\TDDOWNLOAD\sub1\d.txt
'*'为匹配模式,代表匹配所有文件,只有这样才能将子文件夹查出来,以便递归深入,探查下一层的文件。