目录也称文件夹,用于分层保护文件,通过目录可以分门别类地存放文件,也可以通过目录快速地找到想要的文件,在Python中并没有提供直接操作目录的函数或者对象,而是需要使用内置的os
和os.path
模块实现。
用于定位一个文件或者目录的字符串被称为一个路径,在程序开发的时候,通常会涉及两种路径:一种是相对路径,另一种是绝对路径。
当前工作目录是指当前文件所在的目录。可以通过os模块提供的getcwd()函数获取当前工作目录。
import os
print(os.getcwd()) # 输出当前工作目录
相对路径就是依赖当前的工作目录,如果在当前工作目录下有一个名称为message.txt的文件,那么在打开这个文件时,就可以直接写上文件名,这时采用的就是相对路径。
在路径中,注意下面3个特殊符号的语义:
/
:表示根目录,在Windows系统下表示某个盘的根目录,如’E:‘。
.
:表示当前目录,也可以写成’./‘。在当前目录中可以直接写文件名或者下级目录。
..
:表示上级目录,也可以写成’…/'。
分别使用’/‘、’./‘和’…/'打开文本文件,然后执行写入操作。
f = open('test1.txt','w')
f.write('当前目录')
f.close()
f = open('/test2.txt','w')
f.write('根目录')
f.close()
f = open('./test3.txt','w')
f.write('当前目录1')
f.close()
f = open('../test4.txt','w')
f.write('上级目录')
f.close()
绝对路径是指在使用文件时指定文件的实际路径,他不依赖于当前工作目录,可以通过os.path
模块提供的abspath()
函数获取一个文件的绝对路径。
'''
os.path.abspath(path)
path 为要获取绝对路径的相对路径,可以是文件,也可以是目录。
'''
import os
path1 = os.path.abspath('.') # 获取当前所处的文件夹绝对路径
print(path1) # /Users/guanfawang/Python_Language/file_operations
path2 = os.path.abspath('..') # 表示当前文件夹的上一级文件夹的绝对路径
print(path2) # /Users/guanfawang/Python_Language
‘‘字符具有转义功能,可以使用’\‘替换,也可以使用’/‘代替’’。更简单的方法是在字符串前面加R或r前缀。
当把多个路径拼接为一个路径时,不建议直接使用字符串拼接。因为在Linux、Unix系统下,路径分隔符是斜杆’/‘;在Windows系统下,路径分隔符是反斜杠’‘,也可以兼容’/‘;在Mac OS系统中,路径分隔符是冒号’/'。
一般使用os.path子模块提供的join()
函数把多个路径拼接为一个路径。
'''
os.path.join(path1[,path,...])
'''
import os
path1 = 'home'
path2 = 'develop'
path3 = 'code'
path4 = ''
path5 = os.path.join(path1,path2,path3)
print(path5) # home/develop/code
path6 = os.path.join(path1,path2,path4)
print(path6) # home/develop/
判断给定的目录是否存在,可以使用os.path模块的exists()
函数实现。
'''
os.path.exists(path)
'''
import os
b = os.path.exists('test') # 判断当前目录下是否存在test文件夹
print(b) # False
exists()
函数不区分路径是目录还是文件,如果要区分指定路径是目录、文件、链接,或者为绝对路径,可以使用下面的专用函数。
os.path.isabs(path)
:检测指定路径是否为绝对路径。
os.path.isdir(path)
:检测指定路径是否为目录。
os.path.isfile(path)
:检测指定路径是否为文件。
os.path.isline(path)
:检测指定路径是否为链接。
# 快速统计指定文件目录下所有文件类型的个数
import os
def count_filetype(file_path):
file_dict={}
file_list=os.listdir(file_path)
for file in file_list:
pathname = os.path.join(file_path,file)
if os.path.isfile(pathname):
(file_name,file_extention) = os.path.splitext(file)
if file_dict.get(file_extention) == None:
count = 0
else:
count = file_dict.get(file_extention)
count += 1
file_dict.update({file_extention:count})
for key,count in file_dict.items():
print('\"%s\"文件夹下类型为\"%s\"的文件共有\"%s\"个'%(file_path,key,count))
count_filetype(r'/Users/guanfawang/Python_Language') # 打印信息
'''
"/Users/guanfawang/Python_Language"文件夹下类型为".md"的文件共有"1"个
'''
os模块提供了两个创建目录的函数:一个是创建一级目录(单个目录),另一个用于创建多级目录(多个目录)。
os.mkdir(path,mode=0777)
:创建单个目录。os.rmdir(path)
:删除单个目录。os.makedirs(path,mode=0777)
:创建多级目录。os.removerdirs(path)
:删除多级目录。import os
path1 = 'test' # 定义单级目录
if not os.path.exists(path1):
os.mkdir(path1) # 创建一级目录
if os.path.exists(path1):
os.rmdir(path1) # 删除一级目录
path2 = 'test/sub_test' # 定义多级目录
if not os.path.exists(path2):
os.makedirs(path2) # 创建多级目录
if os.path.exists(path2):
os.removedirs(path2) # 删除多级目录
rmdir()
和removedirs()
函数只能删除空目录。如果要删除非空目录,可以使用shutil模块的rmtree(path)
函数实现。
import shutil
shutil.rmtree('test')
遍历就是对指目录下的全部目录(包括子目录)及文件运行一遍。
os模块提供了walk()
函数,可用于目录的遍历;
'''
os.walk(top,topdown=True,οnerrοr=None,followlines=False)
'''
import os
def visitDir(path):
for root,dirs,files in os.walk(path): # 遍历目录
for filepath in files: # 遍历文件
print(os.path.join(root,filepath)) # 输出文件的完整路径
visitDir('/Users/guanfawang/Python_Language/file_operations')