共计 7643 个字符,预计需要花费 20 分钟才能阅读完成。
引言
这篇文章介绍如何应用 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 零碎举例:
#!/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)也会被读取到,但在输入或写入其余文件时,这些换行符会被主动转换成换行,请看上面的实例:
#!/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() 函数,它可能读取文件中的每一行数据并保留为一个列表,每行数据相当于列表的一个元素,能够遍历列表每个元素输入每一行数据,或打印出每一行的字符数,请看上面的实例:
#!/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 不仅仅能关上单个文件,还能一次性关上多个文件,如下:
#!/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” 参数来读取二进制数据流,例如:
#!/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 命令中增加字符编码,例如:
#!/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 这个文件中追加内容,请看上面的实例:
#!/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
当初,下面的内容曾经能够让咱们将一个文件的内容复制进去追加到另外一个文件的开端了,上面是一个简略的实现:
#!/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() 函数能够用于获取文件的扩展名,请看上面的实例:
#!/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() 函数可用于获取文件的绝对路径,这个函数无奈判断传入的文件是否存在,就算这个文件不存在,依然能够应用这个函数,函数会将文件名和以后脚本执行的绝对路径目录拼接起来:
#!/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:
import os
print(os.path.getsize("/home/qing/test/qingsword.txt"))
#输入,qingsword.txt 只有 89 字节
89
h. 获取文件最新批改工夫
os.path.getmtime() 函数可能失去文件从 1970 年起到上次批改之间通过的秒数,应用 time 模块的 ctime() 办法,可能将这个秒数格式化为规范工夫输入:” 星期 月 日 时: 分: 秒 年 ”
#!/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 模块来实现文件的挪动与复制,请看上面的实例:
#!/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")