递归列出目录中的文件
函数讲解
os .listdir() 列出当前目录下的内容。
1
2In [5]: os.listdir('/root/aming')
Out[5]: ['advance', 'basic', 'tmp.txt']os.path.isdir() 判断是否为目录,是,返回True;不是或不存在,返回False。
1
2
3
4
5In [6]: os.path.isdir('/root/aming')
Out[6]: True
In [7]: os.path.isdir('/root/aming/tmp.txt')
Out[7]: Falseos.path.isfile() 判断是否为文件,是,返回True;不是或不存在,返回False。
1
2
3
4
5
6
7
8In [8]: os.path.isfile('/root/aming')
Out[8]: False
In [9]: os.path.isfile('/root/aming/222')
Out[9]: False
In [10]: os.path.isfile('/root/aming/tmp.txt')
Out[10]: Trueos.path.join() 将字符连接为目录,不判断该路径是否存在。
1
2
3
4
5
6
7
8In [11]: os.path.join('root','aming','tmp.txt')
Out[11]: 'root/aming/tmp.txt'
In [12]: os.path.join('/root','aming','tmp.txt')
Out[12]: '/root/aming/tmp.txt'
In [13]: os.path.join('/root','aming','123')
Out[13]: '/root/aming/123'
递归输出
列出目录下所有文件,包括子目录1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#!/usr/bin/python
import os
import sys
def printFiles(path):
lsdir = os.listdir(path)
dirs = [i for i in lsdir if os.path.isdir(os.path.join(path,i))]
files = [i for i in lsdir if os.path.isfile(os.path.join(path,i))]
if files:
for f in files:
print os.path.join(path,f)
if dirs:
for d in dirs:
printFiles(os.path.join(path,d))
printFiles(sys.argv[1])
输出结果1
2
3
4
5
6/root/aming/tmp.txt
/root/aming/advance/1_5_1.py
/root/aming/advance/1_4_4.py
/root/aming/advance/1_1_3.py
......................
/root/aming/basic/2_3_2.py
注意:当上述文件中if files:和if dirs:判断调换位置,输出结果将会发生变化,可自行尝试。
匿名函数
关键字lambda
表示匿名函数。
lambda函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方。
匿名函数只能有一个表达式,不用写return
,返回值就是该表达式的结果。
实例对比
1 | def fun(x,y): |
更改为lambda函数1
2r = lambda x, y:x * y
r(2, 3)
lambda语句中,冒号前是参数,可以有多个,逗号隔开;冒号后是返回值。1
2
3
4In [26]: r = lambda x, y:x*y
In [27]: r(3,4)
Out[27]: 12
lambda语句构建的其实是一个函数对象。1
2In [28]: r
Out[28]: <function __main__.<lambda>>
带有< >这种都是对象。
优点
使用lambda可以省去定义函数的过程,让代码更精简。
对于一些抽象的,不会被别的地方重复使用的函数,使用lambda不需要考虑命名的问题。
使用lambda有些时候让代码更容易理解。
实例
- reduce()函数
对序列进行操作,具体操作由lambda函数定义,定义的函数必须为2元计算。1
2In [29]: reduce(lambda x, y:x + y, range(1,101))
Out[29]: 5050