最近对python产生了兴趣,看了书后就想写写python代码实践一下。
我想到了一个递归遍历目录下所有文件的例子:首先显示当前的工作目录,然后遍历该目录下的所有文件,如果遇到的是目录(文件夹),则也显示该目录下的所有文件,如此循环。
实现代码如下
1
2
3
4
5
6
7
8
9
10
11
12
|
import
os
def
get_file_names(path_name):
print
path_name
file_names
=
os.listdir(path_name)
for
name
in
file_names:
if
os.path.isdir(name):
get_file_names(os.path.abspath(name))
else
:
print
name
get_file_names(os.getcwd())
|
上面代码中的os.getcwd()的作用是返回当前的工作目录,os.listdir 以列表的形式返回该目录下的所有文件和目录,但不包括子目录中的内容。
python 中怎么判断一个路径是文件还是目录(文件夹)呢?用os.path.isfile() 或者 os.path.isdir() 函数。
奇怪的是,开始我以为如果不是文件就是目录了,于是写了一下的代码
1
2
3
4
|
if
os.path.isfile(name):
print
name
else
:
get_file_names(os.path.abspath(name))
|
结果遍历目录下的一个可执行ruby脚本文件却报错
OSError: [Errno 2] No such file or directory
就是认为某一个可执行的.rb文件不是文件,即os.path.isfile(“test.rb”)返回False ,难道是要文本文件才是真的,可是可执行的python 脚本文件却又可以正常输出文件名。
所以我改用os.path.isdir(),也这样才合理,因为毕竟是目录才可以遍历嘛。注意,file_names中存储的是文件名或者目录名,目录名需要转化为绝对路径才可以传递给get_file_names() 函数,所以使用 os.path.abspath() 把相对路径转化为绝对路径。
其实,python 还有另一个遍历文件的函数os.walk ,它可以返回目录下的所有文件和目录,包括子目录下的内容。os.walk()函数返回的是一个元组,该元组有3个元素,这3个元素分别表示每次遍历的路径名,目录列表和文件列表。
所以上面的get_file_names()函数的部分可以写为
os.walk()实例代码:
1
2
3
4
|
file_names
=
os.walk(path_name)
for
root,dirs,files
in
file_names:
for
filename
in
files:
print
os.path.join(root,filename)
|
os.path.join()的用法
os.path.join(path1[, path2[, ...]])是将对个路径连接组合返回,其中第一个绝对路径之前的参数会被忽略。