当前位置: 首页 > Linux

[Python]-10-文件读写(中)

时间:2023-04-06 01:43:40 Linux

简介本文介绍如何使用python的os和shutil模块对文件或文件夹进行读写、创建、删除等操作。文章目录0×2。文件夹相关操作a.拼接路径B.获取子目录名称c.归一化路径输出d.判断目录或文件是否存在e.列出目录f中的所有文件。创建和删除文件夹g.通配符h.的使用。文件和文件夹重命名i.文件夹副本0×2。文件夹相关操作a.拼接路径os.path.join()函数是用来拼接路径的,它不会判断两条路径是否存在,只是完成拼接前一个路径和后一个路径的功能,请看下面的例子:#!/usr/bin/envpython#coding=utf-8importospath1="/www"path2="qingsword/com"print(os.path.join(path1,path2))#Output/www/qingsword/comb.获取子目录名有时我们可能需要获取某个路径下的最后一个子目录名。Python提供了一个os.path。split()方法用于切路径,请看下面的例子:#!/usr/bin/envpython#coding=utf-8importospath1="/www/qingsword/com"#split()方法返回一个tuple,包含父路径和子目录名两个元素print(os.path.split(path1))#可以直接用两个对象接收元组中的这两个元素p1,p2=os.path.split(path1)print(p1)print(p2)#Output('/www/qingsword','com')/www/qingswordcom如果想递归获取路径中各个目录的名字,可以使用如下方法:#!/usr/bin/envpython#coding=utf-8importos#------defsplit_fully(path):"""递归获取路径中每个目录的名称,返回一个元组"""parent_path,dir_name=操作系统。path.split(path)ifdir_name=="":return(parent_path,)else:returnsplit_fully(parent_path)+(dir_name,)path1="/www/qingsword/com"forpinsplit_fully(path1):print(p)#output/wwwqingswordcom在上面的例子中,程序的运行过程如下,split_fully()函数首先将路径“/www/qingsword/com”拆分为“/www/qingsword”和“com”,因为dir_name不为空,所以执行returnsplit_fully(parent_path)+(dir_name,),这句话中(dir_name,)等同于(com,)前半部分使用父路径调用函数本身,外层函数会被挂起,等待split_fully(parent_path)的结果返回,此时调用parent_path="/www/qingsword";第一次调用自身"/www/qingsword"拆分为"/www"和"qingsword",由于dir_name不为空,函数第二次调用自身。这时候如果我们把所有变量代入数据,返回到最外层的暂停函数,查看返回,应该是这样一个结构returnsplit_fully("/www")+(qingsword,)+(com,);第二次调用自己,"/www"分成parent_path="/",dir_name="www"不为空,程序会第三次调用自己,这次是parent_path,dir_name=os.path.split(path)拆分后dir_name为空,所以returnparent_path="/",逐层返回,最外层结构变为return("/",)+("www",)+("qingsword",)+("com",),只需要遍历这个元组就可以得到每个元素的值C。规范化路径在路径“.”中输出。表示当前目录,“..”表示父目录。如果我们不想让这些符号出现,我们可以使用os.path.normpath()函数,它不仅可以规范路径,还可以将两个点号自动解析到父目录中,路径中多余的斜杠可以去掉,请看下面的例子:#!/usr/bin/envpython#coding=utf-8importospath1="///www/./qingsword////hidden/..//com"print(os.path.normpath(path1))#normpath会自动去掉目录中多余的斜杠,解析..为父目录,所以隐藏目录..相当于在隐藏目录执行了一个"cd.."命令,回到青剑目录,.www目录后面代表当前目录,所以直接去掉,最后输出如下/www/qingsword/comd判断目录或文件是否存在。os.path.exists()函数可以判断目标是否存在,但无法判断目标是文件还是目录。请看下面的例子:#!/usr/bin/envpython#coding=utf-8importospath1="/www/qingsword/com"print(os.path.exists(path1))print(os.path.exists("textfile"))#Output,如果目标存在则返回True,如果不存在则返回FalseTRUEFALSEe.列出目录下的所有文件使用os.listdir()函数返回名称列表目标目录下的所有文件夹和文件,看下面例子:#!/usr/bin/envpython#coding=utf-8importos#获取当前脚本所在目录的绝对路径file_path=os.path.abspath(".")#遍历list,打印出每个文件或文件夹的名称fornameinos.listdir(file_path):print(name)#如果要打印出每个文件或文件夹的完整路径在目录下,可以修改print函数,下面两种方法效果一样,您可以使用sorted()函数默认是按照字母顺序排列的,并且区分大小写,大写字母>符号>小写字母,这样for中的名字就会按照排序后的顺序进行读取和拼接:#!/usr/bin/envpython#coding=utf-8importosfile_path=os.path.abspath(".")#Sortingoutputfornameinsorted(os.listdir(file_path)):print(os.path.join(file_path,name))上面的例子只是可以遍历某个目录下的文件和目录,但是不能进行递归查询,也就是说不能搜索到该目录下的子目录下的文件。下面是一个遍历子目录文件的方法:#!/usr/bin/envpython#coding=utf-8importos#------defprint_tree(path):"""递归目录"""ifos.path.isdir(path):#遍历目录,打印absolutepathfornameinos.listdir(path):abs_path=os.path.join(path,name)print(abs_path)#如果路径是目录,则调用自身并打印子目录内容ifos.paths.absdir(:print_tree(abs_path)print_tree("/home/qing/test")再看一个例子,读取目录下的文件,显示每个文件的绝对路径、大小和最后修改时间:#!/usr/bin/envpython#coding=utf-8importosimporttime#------deflist_dir(path):"""打印目录中文件或文件夹的大小、最后修改时间和绝对路径"""ifos.path.isdir(path):fornameinos.listdir(path):abs_path=os.path.join(path,name)sz=os.path.getsize(abs_path)modify_time=time.ctime(os.path.getmtime(abs_path))print("大小:%-8d最后修改时间:%-25s路径:%s"%(sz,modify_time,abs_path))list_dir("/home/qing/test")使用列表生成公式可以很简洁的打印出某类文件列表,例如:#!/usr/bin/envpython3#coding=utf-8importos#列出脚本所在文件夹下的所有文件和文件夹名称print([xforxinos.listdir(os.path.abspath("."))])#列出脚本所在文件夹下的所有子文件夹位于Nameprint([xforxinos.listdir(os.path.abspath("."))\ifos.path.isdir(x)])#列出脚本所在文件夹下的所有py文件名位于print([xforxinos.listdir(os.path.abspath("."))\ifos.path.isfile(x)andos.path.splitext(x)[1]==".py"])f.CreatedeletefolderCreatefolder:#!/usr/bin/envpython#coding=utf-8importos#os.mkdir()functioncanonlycreateafolderatatimeifnotos.path.exists("qingsword"):os.mkdir("qingsword")#os.makedirs()函数可以一次递归创建多个文件夹ifos.path.isdir("qingsword"):os.makedirs("qingsword/1/2/3/4")ps:在创建文件夹的过程中,如果目标存在,会抛出“FileExistsError”异常删除文件夹:#!/usr/bin/envpython#coding=utf-8importosimportshutilifos.path.isdir("qingsword"):os.rmdir("qingsword/1/2/3/4")shutil.rmtree("qingsword")ps:os.rmdir()函数只能删除单个文件夹,文件夹必须为空,否则会抛出“OSError”异常,shutil模块的rmtree方法可以删除一个目录和下面的所有文件。G。通配符的使用在python路径操作中,常见的通配符有以下几种:匹配多个字符;?匹配单个字符;[...]匹配括号中的单个字符,可以指定多个字符或字符范围,例如:[ABCD]表示可以匹配ABCD中的任意一个;[a-z]匹配小写字母中的任何字符;[0-9]匹配0-9中的任意一个数字;[!...]不匹配括号中指定的任何一个或某个范围内的一个;python中有一个通配符模块glob,这个模块的glob()函数类似于os.listdir(),可以返回某个目录下的文件,但是glob.glob()函数更强大,可以配合使用通配符返回指定的文件类型,请看下面的例子:#!/usr/bin/envpython#coding=utf-8importosimportglobpath1="/home/qing/test"ifos.path.isdir(path1):#返回path1目录下所有py后缀的文件print(glob.glob(os.path.join(path1,"*.py")))#返回a-d范围内文件名最后一个字符的py文件insideprint(glob.glob(os.path.join(path1,"*[a-d].py")))#返回文件名为四个字符的py文件print(glob.glob(os.path.join(path1),"????.py")))返回文件名为三个字符且最后一个字符不在b-f范围内的py文件print(glob.glob(os.path.join(path1,"??[!b-f].py")))#这就是glob函数强大的地方,递归path1目录,返回目录及子目录下的所有py文件print(glob.glob(os.path.join(path1,"*/*.py")))Ps:glob.glob()函数的返回类型是一个列表。H。文件和文件夹重命名os模块的rename方法可以实现文件和文件夹重命名的操作,请看下面的例子:#!/usr/bin/envpython3#coding=utf-8importos#iffile1existsandfile2does不存在,将file1重命名为file2,如果os.path.exists("file1")而不是os.path.exists("file2"),file1可以是文件或文件夹的绝对路径或相对路径:os.rename("文件1","文件2")i.文件夹复制可以使用shutil模块的copytree方法将一个目录复制到目标位置,例如:#!/usr/bin/envpython3#coding=utf-8importosimportshutildefcopyDir(src,dst):"""完成将源文件夹复制到目标位置"""ifos.path.isdir(src)而不是os.path.exists(dst):shutil.copytree(src,dst)print("Copysucceeded.")else:print("Copyfailed.")defmoveDir(src,dst):"""完成将源文件夹移动到目标"""如果os.path.isdir(src)而不是os.path.exists(dst):shutil.copytree(src,dst)shutil.rmtree(src)print("移动成功。")else:print("移动失败。")moveDir("dir1","dir2")copyDir("dir1","dir2")