Python基础篇——Day10
文件操作(IO技术)
文本文件和二进制文件
Python默认的编码方式为Unicode编码,两个字节表示一个字符,最多可表示65536个
- 文本文件
文本文件存储的是普通的“字符”文本,可以用记事本程序打开,像word文档不是文本文件 - 二进制文件
二进制文本把数据内容用“字节”存储,无法使用记事本打开,必须使用专门的软件解码,常见的有MP4,MP3音频,JPG图片,doc文档等
文件操作模块
Python标准库提供了文件操作的相关模块,常见的模块如下:
名称 | 说明 |
---|---|
io模块 | 文件流的输入和输出 |
os模块 | 基本操作系统功能,包括文件操作 |
glob模块 | 查找符合特定规则的文件路径名 |
fnmatch模块 | 使用模式来匹配文件路径名 |
fileinput模块 | 处理多个输入文件 |
filecmp模块 | 用于文件的比较 |
csv模块 | 用于csv文件处理 |
pickle和cpickle | 用于序列化和反序列化 |
xml包 | 用于XML数据处理 |
创建文件对象open()
open()语法:
open(文件名[,打开方式])
打开方式:
模块 | 描述 |
---|---|
r | 读模式 |
w | 写模式,如果文件不存在则创建,若存在则重写新内容 |
a | 追加模式,如果文件不存在则创建,若存在则在末尾追加新内容 |
b | 二进制模式(可与其它模式组合使用) |
+ | 读、写模式(可与其它模式组合使用) |
文本文件和二进制文件对象的创建:
如果没有二进制模式"b",则默认创建的是文本文件对象,处理的基本单元是字符,若有二进制"b",则创建的是二进制文件对象,处理的基本单元是字节
文本文件的写入
步骤:
- 创建对象
- 写入数据
- 关闭对象
操作示例:
'''
文本文件写入演示
'''
f=open(r"E:\a.txt","a") # 解释器调用操作系统进行编码,windows系统默认GBK编码,linux系统默认UTF-8编码
s="kkk"
f.write(s)
f.close()
为什么要有关闭操作:
执行Python程序需要通过解释器,解释器在操作系统上运行,而操作系统才是直接与硬盘进行互动的,也就是说Python程序想对硬盘进行操作,需要通过解释器调用操作系统的资源,进而操作硬盘,故在程序执行完后,需要通过close()方法来关闭由操作系统打开的相关资源
close()关闭文件流
由于文件底层是由操作系统控制的,所以我们打开的文件对象必须显式地调用close()方法关闭文件对象,当调用close()方法时,会首先把数据由缓冲区写入文件(也可以用flush()方法实现,但不关闭文件),再关闭文件,释放文件对象
为了确保打开的文件对象都能正常关闭,一般结合异常控制finally语句或with语句实现“无论何种情况均能关闭文件对象”的操作
文本文件的读写
读取:
- read(size)
从文件中读取size个字符,并作为结果返回,若没有参数则会读取整个文件,读到文件末尾,会返回空字符串 - readline()
读取每一行内容作为结果返回,读到文件末尾,则会返回一个空字符串 - readlines()
文本文件中,每一行作为一个字符串存入列表中,返回该列表
写入:
- write(a)
把字符串a写入到文件中 - writelines(b)
把字符串列表写入到文件中,不添加换行符(所以要换行的话需要在字符串列表中添加换行符)
二进制文件的读写
二进制文件的处理流程和文本文件一致,首先还是要创建文件对象,但是需要指定二进制模式,从而创建出二进制文件对象,如:
- f=open(path,‘wb’)
可写的、重写模式的二进制文件对象 - f=open(path,‘ab’)
可写的,追加模式的二进制文件对象 - f=open(path,‘rb’)
可读的二进制文件对象
创建好二进制文件后,仍可以使用write(),read()等方法实现文件的相关读写操作
操作示例:
'''
读取图片文件,实现文件的拷贝
'''
with open("aa.gif","rb") as f:
with open("aa_copy.gif","wb") as w:
for line in f.readlines():
w.write(line)
print("done!")
seek()任意位置操作
seek语法:
seek(offset[,whence])
'''
把文件指针移动到新的位置,offset表示相对于whence的
多少个字节的偏移量,请注意是字节哦
offset:
为正:往结束方向移动
为负:往开始方向移动
whence:
为0:从文件头(0位)开始计算(默认值)
为1:从当前位置开始计算
为2:从文件尾开始计算
'''
操作示例:
'''
已知文本文件如下:
1#1
2#2
3#3
'''
with open(r"E:\a.txt","r",encoding="utf-8") as f:
print("name is:",f.name) # 告诉我文件名
print(f.tell()) # 告诉我当前指针的位置
print(f.readline())
print(f.tell()) # 再次告诉我指针位置
f.seek(1) # 相对于文件头的偏移量
print(str(f.readline()))
'''
结果为:
name is: E:\a.txt
0
1#1
5
1
#1
'''
pickle序列化
Python中一切都是对象,对象本质是“存储数据的内存块”,当我们需要将“内存块的数据”保存到硬盘上时,或者通过网络传输到其它计算机上时,我们就需要用到“对象的序列化和反序列化”。
序列化:
将对象转化为“串行化”的数据形式,存储到硬盘或者通过网络传输到其他地方。
反序列化
将读取的“串行化”数据转化为对象
序列化使用:
pickle.dump(obj,file) # obj是要被序列化的对象,file是指存储的文件
pickle.load(file) # 从file中读取数据,反序列化成对象
操作示例:
'''
将对象序列化到文件中
'''
import pickle
with open(r"E:\b.dat","wb") as f:
a1="four"
a2="five"
pickle.dump(a1,f)
pickle.dump(a2,f)
'''
返序列化读取文件中的数据
'''
with open(r"E:\b.dat","rb") as f:
a1=pickle.load(f)
a2=pickle.loaf(f)
print(a1)
print(a2)
four
five
csv文件的操作
csv(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换,Excel文件和数据库数据的导入导出,与Excel不同,csv文件:
- 值没有类型,所有值均为字符串
- 不能指定字体颜色等样式
- 不能指定单元格宽高,不能合并单元格
- 没有多个工作表
- 不能插入图像图表
操作示例:
'''
测试csv文件的读取写入
'''
import csv
with open(r"E:\dd.csv","w") as f:
b=csv.writer(f)
b.writerow(["ID","NAME","AGE"])
b.writerow(["1001","Tom",18])
b.writerow(["1002","Jack",19])
'''
或者定义一个大列表
c=[["ID","NAME","AGE"],["1001","Tom",18],["1002","Jack",19]]
b.writerows(c)
'''
with open(r"E:\dd.csv","r") as f:
a=csv.reader(f)
for row in a:
print(row)
os模块
常用操作文件的方法
方法 | 描述 |
---|---|
remove(path) | 删除指定文件 |
rename(src,dest) | 重命名文件或目录 |
stat(path) | 返回文件的所有属性 |
listdir(path) | 返回path目录下的文件和目录列表 |
mkdir(path) | 创建目录 |
makedirs(path1/path2/path3/…) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2/…) | 删除多级目录 ,只能删除空目录 |
getcwd() | 获取当前工作目录 |
chdir(path) | 把path设置为当前目录 |
walk() | 遍历目录树 |
sep | 获取当前操作系统所使用的路径分隔符 |
walk()递归遍历所有文件和目录
os.walk()方法
返回一个3个元素的元组(dirpath,dirnames,filenames)
- dirpath:指定目录的路径
- dirnames:该目录下的所有文件夹
- filenames:该目录下的所有文件
os.path模块
常用方法:
方法 | 描述 |
---|---|
isabs(path) | 判断path是否为绝对路径 |
isdir(path) | 判断path是否为目录 |
isfile(path) | 判断path是否为文件 |
exists(path) | 判断指定路径的文件是否存在 |
getsize(filename) | 返回文件的大小 |
abspath(path) | 返回绝对路径 |