python OS库

os.walk函数的用法  (遍历文件夹下文件并获得路径)

我们在使用python时时常会遇到调用某些文件的需求,这时我们就需要得到这些文件的路径。python强大的自带os模块使得获得路径变得很容易。

下面介绍如何使用os.walk函数来遍历文件夹及子文件夹下所有文件并得到路径。

os.walk的完整定义形式如下:

os.walk(top, topdown=True, onerror=None, followlinks=False)
参数:

top:需要遍历目录的地址。
topdown 为真,则优先遍历top目录,否则优先遍历top的子目录(默认为开启)。
onerror 需要一个 callable 对象,当walk需要异常时,会调用。
followlinks 如果为真,则会遍历目录下的快捷方式(linux 下是 symbolic link)实际所指的目录(默认关闭)。
以上四个参数一般只需要指定第一个文件夹路径,剩下的一般情况不需要指定。

os.walk使用
os.walk 的返回值是一个生成器(generator),也就是说我们需要用循环不断的遍历它(不可以直接print),来获得所有的内容。

每次遍历的对象都是返回的是一个三元元组(root,dirs,files)

root 所指的是当前正在遍历的这个文件夹的本身的地址
dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
注意,函数会自动改变root的值使得遍历所有的子文件夹。所以返回的三元元组的个数为所有子文件夹(包括子子文件夹,子子子文件夹等等)加上1(根文件夹)。

 下面举个例子

import os
path = 'E:code'

for root,dirs,files in os.walk(path):
       print(root,dirs,files)

E:code ['a', 'b'] ['1.bmp', 'code.lnk', 'ds.py']
E:codea [] ['2.txt']
E:code [] ['你的.doc']
import os
path = 'E:code'

for root,dirs,files in os.walk(path):
       #print(root,dirs,files)
       for file in files:
           print(os.path.join(root,file))


E:code1.bmp
E:codecode.lnk
E:codeds.py
E:codea2.txt
E:code你的.doc

os.path.splitext(path)

说明:将对应路径的文件名和后缀名分割

示例:

>>> #定义参数内容
... import os
>>> path1='E:	est6.txt'#文件路径
>>> path2='E:	est'#目录
>>>
>>> #用splitext()方法切割
... split_path1=os.path.splitext(path1)
>>> split_path2=os.path.splitext(path2)
>>>
>>> #打印结果
... print(split_path1)#正常切割
('E:	estx06', '.txt')
>>> print(split_path2)#目录切割后异常
('E:	est', '')
>>>

简单运用:统计整个e盘下,txt文件的总数

>>> file_number=0
>>> for root,dirs,files in os.walk("e:\"):
... for file in files:
... if os.path.splitext(file)[1]==".txt":#将对应的文件与文件名分割
... file_number+=1
... #print (file)
...
>>>
>>> print (file_number)
246

os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。

它不包括 . 和 .. 即使它在文件夹中。

只支持在 Unix, Windows 下使用。

path = 'C:/Users/Administrator/Desktop/back_up'
ls = os.listdir(path)
for i in ls:
   print(i)

.DS_Store
1.png
10.png
11.png
12.png
13.png
14.png
15.png
16.png
17.png
18.png
19.png
2.png
20.png
3.png
4.png
5.png
6.png
7.png
8.png
9.png
backward.py
forward.py
generateds.py
model
save_training_imgs
style_imgs
vggnet
新建文件夹

os.path.isdir()os.path.isfile()需要传入的参数是绝对路径

正确用法:需要先使用python路径拼接os.path.join()函数,将os.listdir()返回的名称拼接成文件或目录的绝对路径再传入os.path.isdir()os.path.isfile().


def del_file(path):
ls = os.listdir(path)
for i in ls:
c_path = os.path.join(path, i)
if os.path.isdir(c_path):#判断某一对象(需提供绝对路径)是否为目录
del_file(c_path)
else:
os.remove(c_path)


os.path.isfile()用于判断某一对象(需提供绝对路径)是否为文件

os.path.join()函数:连接两个或更多的路径名组件

               1.如果各组件名首字母不包含’/’,则函数会自动加上

    2.第一个以”/”开头的参数开始拼接,之前的参数全部丢弃,当有多个时,从最后一个开始

    3.如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾

    os.path.join


import sys,os
path1 = 'home'
path2 = 'deve'
path3 = 'code'
path4 = path1 + path2 + path3
path5 = os.path.join(path1,path2,path3)
print('path4:',path4)
print('path5:',path5)

path4: homedevecode
path5: home/deve/code

path1 = '/home'
path2 = 'deve'
path3 = 'code'
path4 = path1 + path2 + path3
path5 = os.path.join(path1,path2,path3)
print('path4:',path4)
print('path5:',path5)

path4: /homedevecode
path5: /home/deve/code


path1 = 'home'
path2 = '/deve'
path3 = 'code'
path4 = path1 + path2 + path3
path5 = os.path.join(path1,path2,path3)
print('path4:',path4)
print('path5:',path5)

path4: home/devecode
path5: /deve/code

path1 = '/home'
path2 = '/deve'
path3 = 'code'
path4 = path1 + path2 + path3
path5 = os.path.join(path1,path2,path3)
print('path4:',path4)
print('path5:',path5)

path4: /home/devecode
path5: /deve/code

path1 = '/home'
path2 = '/deve'
path3 = ''
path4 = path1 + path2 + path3
path5 = os.path.join(path1,path2,path3)
print('path4:',path4)
print('path5:',path5)

path4: /home/deve
path5: /deve/
os.path.dirname

os.path.dirname(path)

语法:os.path.dirname(path)
功能:去掉文件名,返回目录

 
import sys,os
print(os.path.dirname('/root/userfolder/SRFBN_CVPR19/a.py'))

/root/userfolder/SRFBN_CVPR19


原文地址:https://www.cnblogs.com/tingtin/p/12539074.html