1、文本文件和二进制文件
按文件中数据组织形式,把文件分为文本文件和二进制文件两种。
(1)文本文件
文本文件存储的是普通“字符”文本,python 默认为 unicode 字符集(两个字节表示一个字符,最多可以表示:65536 个),可以使用记事本程序打开。但是,像 word 软件编辑的文档不是文本文件
(2)二进制文件
二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有:MP4 视频文件、MP3 音频文件、JPG 图片、doc 文档等等。
2、文件操作相关模块概述
Python标准库里,以下是文件操作相关的模块。
名称 | 说明 |
io 模块 | 文件流的输入和输出操作 input output |
os 模块 | 基本操作系统功能,包括文件操作 |
glob 模块 | 查找符合特定规则的文件路径名 |
fnmatch 模块 | 使用模式来匹配文件路径名 |
fileinput 模块 | 处理多个输入文件 |
filecmp 模块 | 用于文件的比较 |
cvs 模块 | 用于 csv 文件处理 |
pickle 和 cPickle | 用于序列化和反序列化 |
xml 包 | 用于 XML 数据处理 |
bz2、gzip、zipfile、zlib、tarfile | 用于处理压缩和解压缩文件(分别对应不同的算法) |
3、文件对象基本操作
3.1、创建文件对象open()
open()函数用语创建文本对象,基本语法格式如下:
open(文件名,[打开方式])
为了减少“/”的输入,可以使用原始字符串:r’d:/b.text’的格式
打开方式有如下几种:
模式 | 描述 |
r | 读 read 模式 |
w | 写 write 模式。如果文件不存在则创建;如果文件存在,则重写新内容; |
a | 追加 append 模式。如果文件不存在则创建;如果文件存在,则在文件末尾追加内容 |
b | 二进制 binary 模式(可与其他模式组合使用) |
+ | 读、写模式(可与其他模式组合使用) |
在对二进制文件进行操作时,要追加‘b’模式,如’rb’,’wb’等等,对文本文件操作时,处理的基本单元是字符,对二进制文件操作时,处理的基本单元是字节。
3.2、文本文件的写入
文本文件的写入一般分为三个步骤:(1)创建文件对象,(2)写入数据,(3)关闭文件对象。
f=open(r'f:/a.txt','a')
s='write something/n nothing'
f.write(s)
f.close()
执行结果,创建了a.txt,并录入了信息
3.3、常用编码介绍
在操作文本文件时,经常会操作中文,这时候就经常会碰到乱码问题。为了让大家有能力解决中文乱码问题,这里简单介绍一下各种编码之间的关系。
图里,竖向的编码方式是兼容的,如GB2321与GBK是兼容的,横向之间是不兼容的,如GBK与UTF-8是不兼容的。
Windows操作系统默认的编码是GBK,Linux操作系统默认的编码是UTF-8,当我们使用open()时,调用的是操作系统打开的文件,磨人的编码是GBK。
3.4、write()/writelines()写入数据
write(a),把字符串a写入文件中。
writelines(b),把字符串列表写入文件中,不添加换行符。
f=open(r'f:/b.txt','w',encoding='utf-8')
f.write('python is best/n')
f.write('NO ,java is best/n')
f.writelines(['no,','chinese ','is best'])
f.close()
结果如下:
3.5、close()关闭文件流
由于文件底层是由操作系统控制,所以我们打开的文件对象必须显式调用 close()方法关闭文件对象。当调用 close()方法时,首先会把缓冲区数据写入文件(也可以直接调用 flush()方法),再关闭文件,释放文件对象。
为了确保打开的文件对象正常关闭,一般结合异常机制的 finally 或者 with 关键字实现无论何种情况都能关闭打开的文件对象。
try:
f = open(r"f:/d.txt","a")
a = "superman bs"
f.write(a)
except BaseException as e:
print(e)
finally:
f.close()
3.6、with语句
with 关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出 with 块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。
with open(r'f:/c.txt','a',encoding='utf-8') as f :
f.write("I'm batman")
3.7、文本文件的读取
文件的读取一般使用如下三个方法:
(1)read([size])
从文件中读取size个字符,并作为结果返回,如果没有size参数,则读取整个文件。
读取到文件末尾会返回空字符串。
(2)readline()
读取一行内容作为结果返回,读取到文件末尾,会返回空字符串
(3)readlines()
文本文件中,每一行作为一个字符串存入列表中,返回该列表。
with open(r'f:/b.txt','r',encoding='utf-8') as f:
a=f.read()
with open(r'f:/b.txt','r',encoding='utf-8') as f:
b=f.read(4)
with open(r'f:/b.txt','r',encoding='utf-8') as f:
c=f.readlines()
with open(r'f:/b.txt','r',encoding='utf-8') as f:
d=[]
while True:
rd=f.readline()
if not rd:
break
d.append(rd)
print(a,'/n b ',b,'/n c ',c,'/n d ',d)
****结果如下****
python is best
NO ,java is best
no,chinese is best
b pyth
c ['python is best/n', 'NO ,java is best/n', 'no,chinese is best']
d ['python is best/n', 'NO ,java is best/n', 'no,chinese is best']
3.8、二进制文件的读取和写入
二进制文件的处理流程和文本文件流程一致。首先还是要创建文件对象,不过,我们需要指定二进制模式,从而创建出二进制文件对象。如:
f = open(r"d:/a.txt", 'wb') #可写的、重写模式的二进制文件对象
f = open(r"d:/a.txt", 'ab') #可写的、追加模式的二进制文件对象
f = open(r"d:/a.txt", 'rb') #可读的二进制文件对象
with open(r'f:/123.jpg','rb') as a1:
with open(r'f:/123_copy.jpg','wb') as a2:
aa=a1.readlines()
for i in aa :
a2.write(i)
print('复制成功')
4、文件对象的常用属性和方法
文件对象封装了文件相关的操作。文件对象的属性如下:
属性 | 说明 |
name | 返回文件的名字 |
mode | 返回文件的打开模式 |
closed | 若文件被关闭则返回 True |
打开方式:
模式 | 说明 |
r | 读模式 |
w | 写模式 |
a | 追加模式 |
b | 二进制模式(可与其他模式组合) |
+ | 读写模式(可以其他模式组合) |
文件对象的常用方法:
方法名 | 说明 |
read([size]) | 从文件中读取 size 个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容 |
readline() | 从文本文件中读取一行内容 |
readlines() | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回 |
write(str) | 将字符串 str 内容写入文件 |
writelines(s) | 将字符串列表 s 写入文件文件,不添加换行符 |
seek(offset[,whence]) | 把文件指针移动到新的位置,offset 表示相对于 whence 的多少个字节的偏移量;offset:off 为正往结束方向移动,为负往开始方向移动;whence不同的值代表不同含义:0: 从文件头开始计算(默认值)1:从当前位置开始计算2:从文件尾开始计算 |
tell() | 返回文件指针的当前位置 |
truncate([size]) | 不论指针在什么位置,只留下指针前 size 个字节的内容,其余全部删除;如果没有传入 size,则当指针当前位置到文件末尾内容全部删除 |
flush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源 |
5、pickle 序列化
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。我们可以使用 pickle 模块中的函数,实现序列化和反序列操作。
序列化我们使用:
pickle.dump(obj, file) #obj 就是要被序列化的对象,file 指的是存储的文件
pickle.load(file) #从 file 读取数据,反序列化成对象
import pickle
with open(r"f:/data.dat","wb") as f:
a1 = "DC 海王"
a2 = 123456
a3 = ['ab','cd','ef']
pickle.dump(a1,f)
pickle.dump(a2, f)
pickle.dump(a3, f)
with open(r"f:/data.dat","rb") as f:
a1 = pickle.load(f)
a2 = pickle.load(f)
a3 = pickle.load(f)
print(a1)
print(a2)
print(a3)
****结果如下****
DC 海王
123456
['ab', 'cd', 'ef']
6、csv文件的操作
csv是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出。与 Excel 文件不同,CSV 文件中:
(1)值没有类型,(2)所有值都是字符串不能指定字体颜色等样式不能指定单元格的宽高,(3)不能合并单元格,(4)没有多个工作表(5)不能嵌入图像图表
6.1、csv.reader 对象和 csv 文件读取
import csv
with open(r'f:/aa.csv','r')as a:
a_csv = csv.reader(a) #创建 csv 对象,它是一个包含所有数据的列表,每一行为一个元素
headers = next(a_csv) #获得列表对象,包含标题行的信息
print(headers)
for row in a_csv: #循环打印各行内容
print(row)
****结果如下****
['name', 'power', 'age']
['superman', 'max', '20']
['batman', 'strong', '30']
6.2、csv.writer 对象和 csv 文件写入
import csv
headers=['name','power','age']
rows=[('superman','max',20),('batman','strong',30)]
with open(r'f:/aa.csv','a') as f :
f_csv=csv.writer(f)
f_csv.writerow(headers)
f_csv.writerows(rows)
7、os模块
7.1、os模块-文件和目录操作
os 模块下常用操作文件的方法:
方法名 | 描述 |
remove(path) | 删除指定的文件 |
rename(src,dest) | 重命名文件或目录 |
stat(path) | 返回文件的所有属性 |
listdir(path) | 返回path目录下的文件和目录列表 |
os 模块下关于目录操作的相关方法,汇总如下:
方法名 | 描述 |
mkdir(path) | 创建目录 |
makedirs(path1/path2/path3/…) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2…) | 删除多级目录 |
getcwd() | 返回当前工作目录:current work dir |
chdir(path) | 把path设为当前工作目录 |
walk() | 遍历目录树 |
sep | 当前操作系统所使用的路径分隔符 |
7.2、os.path模块
os.path 模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作
方法 | 描述 |
isabs(path) | 判断path是否绝对路径 |
isdir(path) | 判断path是否为目录 |
isfile(path) | 判断path是否为文件 |
exists(path) | 判断指定路径的文件是否存在 |
getsize(filename) | 返回文件的大小 |
abspath(path) | 返回绝对路径 |
dirname(p) | 返回目录的路径 |
getatime(filename) | 返回文件的最后访问时间 |
getmtime(filename) | 返回文件的最后修改时间 |
walk(top,func,arg) | 递归方式遍历目录 |
join(path,*paths) | 连接多个path |
split(path) | 对路径进行分割,以列表形式返回 |
splitext(path) | 从路径中分割文件的扩展名 |
7.3、walk()递归遍历所有文件和目录
os.walk()方法:返回一个 3 个元素的元组,(dirpath, dirnames, filenames),
dirpath:要列出指定目录的路径
dirnames:目录下的所有文件夹
filenames:目录下的所有文件
8、shutil 模块(拷贝和压缩)
shutil 模块是 python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做 文件和文件夹的压缩、解压缩操作。 os 模块提供了对目录或文件的一般操作。shutil 模块作为补充,提供了移动、复制、压缩、解压等操 作,这些 os 模块都没有提供。
拜师教育学员文章:作者:1216-皇甫同学,
转载或复制请以 超链接形式 并注明出处 拜师资源博客。
原文地址:《python基础-第十天-文件操作(未完待续)》 发布于2020-08-07
评论 抢沙发