1. 认识路径
目录也称文件夹,用于分层保护文件,通过目录可以分门别类地存放文件,也可以通过目录快速地找到想要的文件,在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前缀。
2. 拼接路径
当把多个路径拼接为一个路径时,不建议直接使用字符串拼接。因为在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/
3.检测目录
判断给定的目录是否存在,可以使用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"个 '''
4.创建和删除目录
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')
5.遍历目录
遍历就是对指目录下的全部目录(包括子目录)及文件运行一遍。
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')