当前位置: 首页 > 后端技术 > Python

Python基本操作——文件、目录和路径

时间:2023-03-26 11:48:31 Python

使用python的os模块,轻松方便的完成对文件夹、文件和路径的管理和访问操作。1前言在最近的开发中,经常需要对文件进行读取、遍历、修改等操作。如果我想快速轻松地完成这些操作,我选择使用python。通过python标准内置的os模块,只需要几行代码就可以完成想要的操作。在os的使用之后,本文总结了os模块的常用操作,主要分为以下几个部分:文件夹操作:即文件夹创建、修改(重命名/移动)、查询(查看、遍历)、删除等待。文件操作:文件的创建、修改、读取和删除。(文件夹/文件)路径操作:文件夹或文件的路径操作,如绝对路径、文件名与路径拆分、扩展名拆分等。本文涉及os常用函数的使用与展示,主要使用python交互方式代码说明。后面的操作都默认引入了os模块,如下:importos2文件夹操作使用本地E://pythontest目录作为demo目录,当前该目录下文件如下:test│test.txt└─test-1test-1.txttest和test-1是文件夹,test.txt和test-1.txt是文件。2.1查询操作熟悉linux的同学应该熟悉ls/pwd/cd等操作。对应的python也有相应的方法,主要包括:listdir:文件和目录列表getcwd:获取当前目录chdir:改变目录stat:基本文件和目录信息遍历:递归遍历目录>>>os.chdir("E://pythontest")#更改目录>>>os.getcwd()#获取当前目录'E:\\pythontest'>>>os.listdir("test")#文件和目录列表,相对路径['test-1','test.txt']>>>os.listdir("E://pythontest/test")#文件和目录列表,绝对路径['test-1','test.txt']>>>os.stat("test")#获取目录信息os.stat_result(st_mode=16895,st_ino=4503599627377599,st_dev=266147611,st_nlink=1,st_uid=0,st_gid=0,st_size=0,st_atime=1590833033,st_mtime=1590832647,st_ctime=1590832207)>>>os.stat("test/test.txt")#获取文件信息os.stat_result(st_mode=33206,st_ino=2251799813692354,st_dev=266147611,st_nlink=1,st_uid=0,st_gid=0,st_size=4,st_atime=1590832653,st_mtime=1590832609,st_ctime=1590832598)stat函数返回的具体基本信息为文件或目录如下:st_mode:inode保护模式st_ino:inode节点号。st_dev:inode所在的设备。st_nlink:inode的链接数。st_uid:所有者的用户ID。st_gid:所有者的组ID。st_size:普通文件的字节大小st_atime:上次访问的时间。st_mtime:最后一次修改的时间。st_ctime:创建时间。在日常使用中,我们一般使用st_size、st_ctime和st_mtime来获取文件大小、创建时间和修改时间。另外,我们看到输出的时间是秒数。我在这里提一下日期转换处理。(1)秒到日期时间格式字符串>>>importtime#导入时间模块>>>timestruct=time.localtime(1590803070)#转换为时间结构>>>print(timestruct)time.struct_time(tm_year=2020,tm_mon=5,tm_mday=30,tm_hour=9,tm_min=44,tm_sec=30,tm_wday=5,tm_yday=151,tm_isdst=0)>>>time.strftime("%Y-%m-%d%H:%M:%S",timestruct)#格式化时间'2020-05-3009:44:30'(2)格式化日期时间字符串转秒>>>importdatetime#导入datetime模块>>>>timeobject=datetime.datetime.strptime("2020-05-2310:00:00","%Y-%m-%d%H:%M:%S")#将时间字符串解析成时间对象>>>timeseconds=time.mktime(timeobject.timetuple())#获取时间秒>>>print(int(timeseconds))#转换为int并显示1590199200遍历操作walk函数递归遍历目录,返回root、dirs、files,分别对应到当前遍历的目录、子目录和本目录下的文件。>>>data=os.walk("test")#遍历测试目录>>>forroot,dirs,filesindata:#递归遍历并输出...print("root:%s"%root)...fordirindirs:...print(os.path.join(root,dir))...forfileinfiles:...print(os.path.join(root,file))...root:testtest\test-1test\test-2test\test.txtroot:test\test-1test\test-1\test-1.txtroot:test\test-2test\test-2\test-2.txt2.2创建操作mkdir:创建单个目录,如果目录路径中的父目录不存在,则创建失败makedirs:创建多个目录,如果目录路径中的父目录不存在,则自动创建>>>os.mkdir("test")>>>os.mkdir("test1/test1-1")#父目录不存在,错误Traceback(mostrecentcalllast):File"",line1,inFileNotFoundError:[WinError3]系统发现未到达指定路径。:'test1/test1-1'>>>os.makedirs("test1/test1-1")#父目录不存在,会自动创建>>>os.listdir("test1")['test1-1']2.3删除操作rmdir:删除单个空目录,如果目录不为空,报错removedirs:根据路径递归删除多级空目录,如果目录不为空,报错会报>>>os.rmdir("test1")#如果目录不为空,ErrorTraceback(mostrecentcalllast):File"",line1,inOSError:[WinError145]目录不为空。:'test1'>>>os.rmdir("test1/test1-1")>>>os.removedirs("test1/test1-1")#删除多级空目录>>>os.listdir(".")['test']由于删除空目录的限制,最好使用shutil模块中的rmtree函数来删除非空目录及其文件。2.4修改操作重命名:重命名目录或文件,修改文件或目录的路径(即移动操作)。如果目标文件目录不存在,则会报错。renames:重命名目录或文件,如果目标文件目录不存在则自动创建>>>os.makedirs("test1/test1-1")>>>os.rename("test1/test1-1","test1/test1-2")#修改test1-1为test1-2>>>os.listdir("test1")['test1-2']>>>os.rename("test1/test1-2","test2/test2-2")#因为test2目录不存在,所以报错Traceback(mostrecentcalllast):File"",line1,inFileNotFoundError:[WinError3]系统找不到指定的路径。:'test1/test1-2'->'test2/test2-2'>>>os.renames("test1/test1-2","test2/test2-2")#renames可以自动创建不存在的目录>>>os.listdir("test2")['test2-2']如果目标路径文件已经存在,那么os.rename()和os.renames()都会报错:FileExistsError:[WinError183]当文件已经存在时,无法创建文件。3文件操作3.1查询操作open/read/close:filereadingstat:文件信息,详见前面文件夹中的stat说明>>>f=os.open("test/test.txt",os.O_RDWR|os.O_CREAT)#打开文件>>>str_bytes=os.read(f,100)#读取100个字节>>>str=bytes.decode(str_bytes)#将字节转换为字符串>>>print(str)test写入数据>>>os.close(f)#关闭文件。注意open/read/close需要一起操作,open操作需要指定模式。以上是以读写方式打开文件。如果该文件不存在,则创建该文件。每种模式的详细信息如下:flags--该参数可以是以下选项,多个使用"|"os.O_RDONLY:只读打开os.O_WRONLY:只写打开os.O_RDWR:读打开写os.O_NONBLOCK:不阻塞打开os.O_APPEND:追加打开os.O_CREAT:创建和openanewfileos.O_TRUNC:打开一个文件并将其截断为零长度(必须有写权限)os.O_EXCL:如果指定文件存在,则返回错误os.O_SHLOCK:自动获取共享锁os.O_EXLOCK:自动获取独立锁os.O_DIRECT:消除或降低缓存影响os.O_FSYNC:同步写入os.O_NOFOLLOW:不跟踪软链接3.2创建操作上面提到使用open指定模式,如果文件不存在则创建它。有点类似于linux操作中的touch。>>>f=os.open("test/test.txt",os.O_RDWR|os.O_CREAT)#如果文件不存在,则创建>>>os.close(f)3.3修改操作open/write/close:写文件的内容rename,renames:和上面描述的修改名字和移动的操作是一致的。>>>f=os.open("test/test.txt",os.O_RDWR|os.O_CREAT)#打开文件>>>os.write(f,b"testwritedata")#写入内容15>>>os.close(f)#关闭文件3.4deleteremove:删除文件,注意不要删除目录(使用rmdir/removedirs)>>>os.remove("test/test-1")#删除目录错误回溯(最近调用最后):文件“”,第1行,在FileNotFoundError:[WinError2]系统找不到指定的文件。:'test/test1'>>>os.remove("test/test.txt")#删除文件>>>os.listdir("test")['test-1']4路径操作正在使用文件或目录在此过程中,经常需要处理文件和目录路径。因此在os中有一个子模块path,专门处理路径操作。主要操作如下:abspath:返回绝对路径>>>os.path.abspath("test")'E:\\pythontest\\test'exists:判断文件或目录是否存在>>>os.path.abspath("test")'E:\\pythontest\\test'existspath.exists("test")True>>>os.path.exists("test/test.txt")False>>>os.path.exists("test/test-1/test-1.txt")trueisfile/isdir:判断是否为文件/目录>>>os.path.isdir("test")True>>>os.path.isfile("test/test-1/test-1.txt")Truebasename/dirname:获取路径的结尾和路径头。实际上,路径中的最后一个/作为分隔符,将其分为两部分:头和尾。tail是basename返回的内容,head是dirname返回的内容。常用于获取文件名、目录名等>>>os.path.basename("test/test-1/test-1.txt")#文件名'test-1.txt'>>>os.path.basename("test/test-1/")#空内容''>>>os.path.basename("test/test-1")#目录名'test-1'>>>os.path.dirname("test/test-1/test-1.txt")#文件所在的目录路径'test/test-1'>>>os.path.dirname("test/test-1/")#目录路径'test/test-1'>>>os.path.dirname("test/test-1")#父目录路径'test'join:复合路径,即使用系统连接两个参数路径分隔符组成一个完整的路径。>>>os.path.join("test","test-1")#加入两个目录'test\\test-1'>>>os.path.join("test\\test-1","test-1.txt")#连接目录和文件名'test\\test-1\\test-1.txt'split:拆分文件名和文件夹,即用最后一个斜杠“/”分隔路径字符,拆分为头尾,以(头,尾)元组的形式返回。>>>os.path.split("test/test-1")#拆分目录('test','test-1')>>>os.path.split("test/test-1/")#以/('test/test-1','')结尾的目录拆分>>>os.path.split("test/test-1/test-1.txt")#splitfile('test/test-1','test-1.txt')splitext:拆分路径名和文件扩展名,拆分路径最后一个扩展名分隔符“.”,切割成头和尾,以(head,tail)元组的形式返回.请注意,与split的区别在于分隔符的区别。>>>os.path.splitext("test/test-1")('test/test-1','')>>>os.path.splitext("test/test-1/")('test/test-1/','')>>>os.path.splitext("test/test-1/test-1.txt")#区分文件名和扩展名('test/test-1/test-1','.txt')>>>os.path.splitext("test/test-1/test-1.txt.tmp")#取最后一个“.”asthesplitpoint('test/test-1/test-1.txt','.tmp')5示例应用下面通过一些常用的场景综合使用前面的操作函数。5.1批量修改文件名defbatch_rename(dir_path):itemlist=os.listdir(dir_path)#获取iteminitemlist的目录文件列表:#连接到完整路径item_path=os.path.join(dir_path,item)print(item_path)#修改文件名ifos.path.isfile(item_path):splitext=os.path.splitext(item_path)os.rename(item_path,splitext[0]+"-copy"+splitext[1])5.2遍历目录andsubfolders目录中指定扩展名的所有文件defwalk_ext_file(dir_path,ext):#遍历root,dirs,filesinos.walk(dir_path):#获取fileinfiles的文件名和路径:file_path=os.path.join(root,file)file_item=os.path.splitext(file_path)#输出指定扩展名的文件路径ifext==file_item[1]:print(file_path)5.3对指定目录下的文件进行修改排序timedefsort_file(dir_path):#Itemlistbeforesorting=os.listdir(dir_path)print(itemlist)#正向排序itemlist.sort(key=lambdafilename:os.path.getmtime(os.path.join(dir_path,filename)))print(itemlist)#反向排序项目list.sort(key=lambdafilename:os.path.getmtime(os.path.join(dir_path,filename)),reverse=True)print(itemlist)#获取最新修改的文??件print(itemlist[0])6总结当你需要对文件或目录进行操作时,python是一个简单快捷的选择。本文介绍了python标准内置的os模块和子模块os.path的常用方法,最后结合使用场景使用。相信你对文件和目录操作的大部分需求已经得到满足。参考资料pythonos模块:https://www.cnblogs.com/yufeihlf/p/6179547.htmlPythonOS文件/目录方法:https://www.runoob.com/python/os-file-methods.htmlPythonos。path()模块:https://www.runoob.com/python/python-os-path.html上一篇MinIO分布式部署使用MinIO轻松搭建静态资源服务获取SpringBoot多数据源(三):参数更改源获取SpringBoot多数据源(二):动态数据源获取SpringBoot多数据源(一):多套源攻略Java开发必学知识:动态代理2019看过的好书推荐我的公众号(搜索梅森技术说明),了解更多技术说明: