引言
这篇文章介绍如何应用python的os与shutil模块,对文件或文件夹进行读写、创立、删除等操作。
文章目录
0×1.文件相干操作
a.创立文件
b.读取文件内容
c.文件内容追加
d.文件读写异样
e.获取文件扩展名
f.获取文件绝对路径
g.获取文件大小
h.获取文件最新批改工夫
i.文件的挪动复制与删除
0×1.文件相干操作
a.创立文件
Python中创立文件是通过内置的open()函数实现的,这个函数接管最根本的两个参数,第一个为文件门路(绝对或绝对路径),第二个是对文件的操作形式(读写),创立文件有上面两种语法:
语法一:file1=open(“文件门路”,”w”)
语法二:with open(“文件门路”,”w”) as file1:
其中file1是文件对象名称,参数”w”参数通知python解释器,创立一个可写入数据的文件,并在敞开数据流前,放弃可写入状态,语法二是python3举荐的规范办法。
文件门路能够是相对路径或绝对路径,相对路径是绝对以后运行的脚本目录的,windows下文件目录中的反斜杠须要应用本义输入,例如:”C:\windows\system32\filename.txt”;或应用参数前缀”r”勾销字符串中对反斜杠的非凡解决,例如:r”c:\windows\system32\filename.txt”;本文所有的操作都应用ubuntu零碎举例:
<code class="bash">#!/usr/bin/env python #coding=utf-8 #应用语法一,在"/home/qing/test/"目录中创立qingsword.txt文件,如果文件不存在则创立,如果文件存在则笼罩,file1.write()往这个文件中写入了一行数据;如果不增加参数"w"则文件应用只读形式传递给file1对象,在只读模式下,如果文件不存在则会触发"FileNotFoundError"异样。 file1=open("/home/qing/test/qingsword.txt","w") file1.write("www.qingsword.com") file1.close() #敞开文件流 del file1 #删除文件对象开释资源 #如果要输出多行数据,能够应用三引号,python会依据三引号中的格局将每行数据写入文件中,三引号有点相似HTML语言中的pre标签 #应用语法二,实现下面的操作(python3举荐) #!/usr/bin/env python3 #coding=utf-8 with open("/home/qing/test/qingsword.txt","w") as file1: file1.write("""晴刃 qingsword www.qingsword.com""")
留神到下面的两种语法,语法二并没有应用close()函数来敞开文件流,这是因为with表达式外部蕴含两个重要函数,__enter__和__exit__,__enter__函数负责将open()函数的返回值赋予as前面的对象(file1),最初不管该语句块呈现了什么异样,都会在来到时执行__exit__函数,该函数会主动一一敞开关上的文件对象;这样设计的益处不言而喻,在语法一中,如果在close()函数执行前,程序出现异常退出了,那么这个文件流不会被失常敞开,将会始终占用着系统资源,所以举荐应用with来关上一个文件。
本例应用语法二,像文件中输出了三行数据,上面来看看如何读取这些数据内容。
b.读取文件内容
读取文件能够应用文件对象的read()和readline()两个办法,read()会一次性读取所有的文件内容,readline()一次只读一行,在读取内容时,如果文本中有换行符(\n)也会被读取到,但在输入或写入其余文件时,这些换行符会被主动转换成换行,请看上面的实例:
<code class="bash">#!/usr/bin/env python3 #coding=utf-8 import os #导入os模块 #os.path.isfile()函数可能判断传入的门路是否为文件,open函数中的参数"r"示意以只读形式关上文件 if os.path.isfile("/home/qing/test/qingsword.txt"): with open("/home/qing/test/qingsword.txt","r") as file1: line1=file1.readline() #读取一整行(遇到回车符\n终止) print(line1) line1=file1.readline() print(line1) line1=file1.readline() print(line1) #程序输入,输入中每行之间空了一行,这是因为"晴刃"和"qingsword"前面有都有一个换行符"\n",输入文本数据后光标被挪动到了下一行,而print()函数默认状况下会新起一行输入,所以又会再往下挪动一行,才会失去上面这样的后果 晴刃 qingsword www.qingsword.com #如果想去掉换行符,能够应用strip("\n")筛选掉每行前后的换行符,如下 #!/usr/bin/env python3 #coding=utf-8 import os if os.path.isfile("/home/qing/test/qingsword.txt"): with open("/home/qing/test/qingsword.txt","r") as file1: line1=file1.readline().strip("\n") print(line1) line1=file1.readline().strip("\n") print(line1) line1=file1.readline().strip("\n") print(line1) #输入 晴刃 qingsword www.qingsword.com #如果一行的数据太长,一次性读取可能会导致内存溢出,应用readline(字符数)能够读取指定的字符数,例如 #!/usr/bin/env python3 #coding=utf-8 import os if os.path.isfile("/home/qing/test/qingsword.txt"): with open("/home/qing/test/qingsword.txt","r") as file1: line1=file1.readline(2) #获取"晴刃"两个字符 print(line1) line1=file1.readline() #获取到"\n"回车符,当readline遇到回车符时,指定多少字符都没有意义,因为readline遇到回车符后就返回,不会接着往下读取 print(line1) line1=file1.readline(4) #再获取接下来4个字符"qing" print(line1) #输入,依据后面的解释,很容易明确为什么两行数据间会空两行了 晴刃 qing
除了应用下面的形式读取文件内容外,还有一种读取形式,应用readlines()函数,它可能读取文件中的每一行数据并保留为一个列表,每行数据相当于列表的一个元素,能够遍历列表每个元素输入每一行数据,或打印出每一行的字符数,请看上面的实例:
<code class="bash">#!/usr/bin/env python3 #coding=utf-8 import os if os.path.isfile("/home/qing/test/qingsword.txt"): with open("/home/qing/test/qingsword.txt","r") as file1: lines=file1.readlines() print(lines) for line in lines: #输入每一行的字符数(不包含回车符) print(len(line.strip("\n"))) #程序输入 ['晴刃\n', 'qingsword\n', 'www.qingsword.com'] 2 9 17
with不仅仅能关上单个文件,还能一次性关上多个文件,如下:
<code class="bash">#!/usr/bin/env python3 #coding=utf-8 import os try: #增加错误处理 if os.path.isfile("hello.py") and os.path.isfile("if.py"): #应用with来关上一个或多个文件(能够用逗号分隔任意多个文件),应用with的益处是,不须要调用close()函数,with会在区块运行完结后主动调用close()敞开这些文件;read()函数可能一次性读取文件流以后指针所在位置,到文件结尾的所有内容 with open("hello.py","r") as f1,open("if.py") as f2: print(f1.read()) for line in f2.readlines(): #不带任何参数的strip()函数可能去掉字符串前后空格以及换行符与制表符等 print(line.strip()) #如果os操作过程中遇到谬误会被捕捉,本例并没有对可能呈现的os谬误做细分解决 except Exception as erro: pass
如果咱们读取的不是一个文本文件,是一个压缩包文件,一张图片,或一个视频文件,这个时候就须要应用”rb”参数来读取二进制数据流,例如:
<code class="bash">#!/usr/bin/env python3 #coding=utf-8 import os try: if os.path.isfile("cat.jpeg"): with open("cat.jpeg","rb") as img1: #读取当前目录下"cat.jpeg"图片文件二进制数据流的前10个字节 print(img1.read(10)) except Exception as erro: pass #程序输入 b'\xff\xd8\xff\xe0\x00\x10JFIF'
应用参数r来读取文本文件默认是以utf-8编码读取的,如果须要读取其余编码的文件,须要在open命令中增加字符编码,例如:
<code class="bash">#!/usr/bin/env python3 #coding=utf-8 import os try: if os.path.isfile("testfile"): #假如testfile是以gbk编码的,如果文件读取过程中遇到编码谬误,间接疏忽谬误,如果不增加errors关键字,遇到编码谬误时,会抛出UnicodeDecodeError异样 with open("testfile","r",encoding="GBK",errors="ignore") as f1: print(f1.read(1)) except Exception as erro: pass
c.文件内容追加
在下面内容的根底上,当初咱们往qingsword.txt这个文件中追加内容,请看上面的实例:
<code class="bash">#!/usr/bin/env python3 #coding=utf-8 import os file_path="/home/qing/test/qingsword.txt" if os.path.isfile(file_path): #"a"参数示意关上文件并追加内容 #如果不想追加的内容顶在上一次内容的前面,能够写入一个回车符,或应用"三引号"换行输出,在应用"三引号"的时候留神,文本的缩进也会被保留,所以本例的输出都是顶格的 with open(file_path,"a") as file1: file1.write(""" 欢送大家到我的博客学习: www.qingsword.com""") with open(file_path,"r") as file1: print(file1.read()) #读取文件所有内容并输入 #程序输入 晴刃 qingsword www.qingsword.com 欢送大家到我的博客学习: www.qingsword.com
当初,下面的内容曾经能够让咱们将一个文件的内容复制进去追加到另外一个文件的开端了,上面是一个简略的实现:
<code class="bash">#!/usr/bin/env python3 #coding=utf-8 import os #创立两个文件,别离写入数据 file_path_1="/home/qing/test/qingsword_1.txt" file_path_2="/home/qing/test/qingsword_2.txt" with open(file_path_1,"w") as file1,\ open(file_path_2,"w") as file2: file1.write("""欢送大家到我的博客学习: www.qingsword.com""") file2.write("晴刃") #将file_path_2文件中的内容追加到file_path_1文件内容下 if os.path.isfile(file_path_1) and\ os.path.isfile(file_path_2): with open(file_path_2,"r") as file1,\ open(file_path_1,"a") as file2: file2.write("\n") file2.write(file1.read()) #打印出file_path_1文件内容 if os.path.isfile(file_path_1): with open(file_path_1,"r") as file1: print(file1.read()) #程序输入 欢送大家到我的博客学习: www.qingsword.com 晴刃
d.文件读写异样
在对文件读写操作的时候,会呈现上面这些常见的异样,如果心愿程序更加的”敌对”,咱们应该提前理解并应用try语句块捕捉这些异样,上面列举三个比拟常见的异样,这些异样都属于OSError异样类;
FileNotFoundError:当以只读形式关上一个不存在的文件,或门路不存在时,或文件操作过程中找不到某文件时触发;
PermissionError:试图在一个没有权限的目录中读写文件时触发;
IsADirectoryError:试图往一个不存在的文件夹复制文件时触发;
e.获取文件扩展名
os.path.splitext()函数能够用于获取文件的扩展名,请看上面的实例:
<code class="bash">#!/usr/bin/env python #coding=utf-8 import os print(os.path.splitext("qingsword.exe.txt")) print(os.path.splitext("qingsword.exe.txt")[1]) #程序输入,os.path.splitext()函数能够将传入的文件名称的最初一个点前面的扩展名和后面的文件名称宰割成一个元组,通过拜访这个元组索引地位为1的元素,就能失去文件的扩展名 ('qingsword.exe', '.txt') .txt
f.获取文件绝对路径
os.path.abspath()函数可用于获取文件的绝对路径,这个函数无奈判断传入的文件是否存在,就算这个文件不存在,依然能够应用这个函数,函数会将文件名和以后脚本执行的绝对路径目录拼接起来:
<code class="bash">#!/usr/bin/env python #coding=utf-8 import os print(os.path.abspath("qingsword.txt")) #程序输入 /home/qing/python-lab/qingsword.txt #如果是获取以后脚本所在目录的绝对路径,能够应用上面的语法 os.path.abspath(".")
g.获取文件大小
能够应用os.path.getsize()函数获取文件的大小,单位为byte:
<code class="bash">import os print(os.path.getsize("/home/qing/test/qingsword.txt")) #输入,qingsword.txt只有89字节 89
h.获取文件最新批改工夫
os.path.getmtime()函数可能失去文件从1970年起到上次批改之间通过的秒数,应用time模块的ctime()办法,可能将这个秒数格式化为规范工夫输入:”星期 月 日 时:分:秒 年”
<code class="bash">#!/usr/bin/env python #coding=utf-8 import os import time file_path="/home/qing/test/qingsword.txt" print(time.ctime(os.path.getmtime(file_path))) #程序输入 Mon Aug 29 17:01:00 2016
i.文件的挪动复制与删除
python中能够应用shutil模块来实现文件的挪动与复制,请看上面的实例:
<code class="bash">#!/usr/bin/env python #coding=utf-8 import os import shutil if os.path.isfile("qing.txt"): #将以后脚本运行目录下的qing.txt文件复制并重命名为qingsword.txt shutil.copy("qing.txt","qingsword.txt") os.remove("qing.txt") #删除文件 #isdir()函数可能判断指标是否为目录 if os.path.isfile("qingsword.txt") and os.path.isdir("pack1"): #将方才复制的文件剪切挪动到pack1目录下并重命名为qingsword.py shutil.move("qingsword.txt","pack1/qingsword.py")