python学习之文件访问
文件访问
文件的分类:
- 按文件内容分:
- 程序文件:存储的是程序,包括源文件和可执行文件如:.py、.cpp、.exe等文件
- 数据文件:存储的是程序运行时所需的各种数据如:.txt、.docx、.xlsx等文件
- 按信息存储形式分类:
- 文本文件:基于字符编码的文件,常见编码方式:asscll、Unicode编码可以使用文本编辑软件进行修改,常见为:.txt、.html文件
- 二进制文件:存放各种数据的二进制编码,含有特殊的格式及计算机代码,必须用专用程序打开。常见的二进制编码文件有:数据库文件、图像文件、可执行文件、音频文件
文本的访问:
访问步骤:
- 用open()函数打开一个文件,返回一个文件对象
- 调用文件对象中的函数对文件内容进行读或写等操作
- 调用文件对象的close()函数关闭文件
打开文件:
open()函数:python内置函数用于打开一个文件,返回一个文件对象,格式:open(filename[,mode]),filename为要打开文件的名称和路径,mode为文件访问的模式,如只读、写入、追加等,默认为只读(r).
file=open(r"2.py","w")
print("文件名:",file.name)
print("访问模式:",file.mode)
print("是否已关闭:",file.closed)
file.closedwith-as语句进行文本访问:在用open()函数对文件打开或者进行读写扽操作的过程中都有可能发生错误,即使写了关闭文件的语句也不一定能正常执行,从而导致不能正常关闭文件,缓存信息可能会意外丢失,文件可能损坏,所以推荐使用with-as语句减少这种情况,它适用于对资源进行访问的场合,可确保不管在使用过程中是否发生异常都会执行清理操作,释放资源,文件使用后自动关闭
#使用with-as访问文本文件
with open("./1.txt","w") as file: #注意要给权限
num=file.write("Go its own way,let others say!") #向文件写入字符串
print("写入字符%d个!"%num)
文件操作:
写文件:
file.write(str字符串)和file.writelines(seuence字符序列)向文件中写内容
#文件操作
#写文件:
with open("./1.txt","w",encoding="utf-8") as file:
num=file.write("天空再怎么黑暗\n我的内心依旧光明")
print("写了%d个字符"%num)#向文件中追加内容:
str=input("请输入内容:")
with open("./1.txt","a",encoding="utf-8") as file:#参数a是以追加方式打开
file.write("\n")
num=file.write(str)
print("写了%d个字符" % num)#向文件中写入元组:
mingtuple=("王阳明","郑和","戚继光")
with open("./ming.txt","w",encoding="utf-8") as file:
num=file.write(str(mingtuple))
print("将元组写入文件")#使用file.writelines(sequence)向文件中写入字符序列:
str=["好雨知时节,当春乃发生.\n","随风潜入夜,润物细无声"]
with open("杜甫.txt","w",encoding="utf-8") as file:
file.writelines(str)
print("写入字符序列成功!")
读文件:三个函数file.read(),file.readline(),file.readlines()
file.read([size]):读取一个文件的内容,返回一个字符串对象size是要读取内容的数目是可选参数
#文件读取:
#file.read()和for循环读取文件内容:
with open("./杜甫.txt","r",encoding="utf-8") as file:
str=file.read()
print(str)
print("分割线",'-'*20)
with open("1.txt","r",encoding="utf-8") as file:
for i in file:
print(i,end=' ')file.readline([size])函数从文件中读取一行返回一个字符串对象size为内容的数目可选
file.readlines([sizeint]):功能是读取并返回该文件中包含的所有行,以字符串列表形式返回sizeint为读取的字节数,可选参数
其他文件操作:
- file.close():关闭文件。关闭文件后不能进行读写操作。
- file.flash():刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件,而不是被动地等待输出缓冲区写入
- file.fileno():返回一个整型的文件描述符
- file.isatty():如果文件连接到一个终端设备则返回true,否则返回false
- file.tell():返回文件当前位置
- file.seek():重定位文件对象的指针位置
- file.truncate([size]):从文件的首行首字符开始截断,截断文件为size个字符,无size表示从当前位置截断:截断之后后面的所有字符被删除
#使用file.tell()和file.seek()重定位
with open("./1.txt","r",encoding="utf-8") as file:
data=file.readline()
print(data.strip())
print('输出一行后的文件指针在:',file.tell())#查看指针位置
file.seek(0)
print('用seek()将文件指针放回开始处:',file.tell())
print('再次输出:',file.readlines())
二进制文件访问:
对二进制文件不能直接用记事本等文本编辑软件直接进行读写,也无法通过python的文件对象直接读取和理解二进制文件中的内容,要想正确读写二进制文件必须理解二进制文件的结构,序列化,反序列化。
- 序列化:指的是把内存中的数据对象在不丢失其类型的情况下转换成对应的二进制信息
- 反序列化:将二进制信息准确无误地恢复到原来的数据对象的过程
二进制文件访问的三步:
- 打开二进制文件
- 访问二进制文件,写操作是将要写入的内容序列化后写入文件的过程,操作是将二进制文件内容读出反序列化的过程
- 关闭二进制文件
使用pickle模块读写二进制文件:
pickle模块只能在python中使用,几乎python中所有的数据类型都可以用pickle模块实现序列化。
pickle模块有两个函数:pickle.dump()序列化数据对象,并将该对象写入二进制文件:格式“pickle.dump(data,file[,protocoll])”data为写入二进制文件的数据对象,file创建或打开的文件对象,protocol为序列化的模式。
pickle.load(file):反序列化函数,将二进制文件中的内容解析为一个数据对象,file为打开二进制文件对象
|
|
使用struct模块读写二进制文件:
方法:
- 向二进制文件中写数据,先使用pack()函数对数据对象按指定的格式进行序列化,然后使用文件对象write()函数将序列化的结果写入二进制文件
- 从二进制文件中读数据,先使用文件对象的read()函数读取二进制文件中的内容然后使用struct模块的unpack()函数完成反序列化后得到原来的数据对象
函数格式:
struct.pack(fmt,data1,data2…):fmt给定格式化字符串,data1、data2为要写入的数据对象
struct.unpack(fmt,string):fmt为给定格式化字符串,string为反序列化的字符串
|
|
使用marshal模块读写二进制文件:
marshal.dump(data,file):将数据对象序列化后写入二进制文件中,data待序列化数据对象,file为创建或打开文件对象
marshal.load(file):将二进制文件中的内容反序列化为数据对象
|
|
使用shelve模块读写二进制文件:
shelve模块提供一种类似字典方式操作二进制文件的功能,如向二进制文件中写入、读出、修改数据。提供一个简单的数据存储方案,只有一个open()函数,它接收一个文件名作为参数,返回一个shelf对象.
shelve.open(filename,mode,protocol=None,writeback=False)
filename:打开或创建二进制文件
model:文件打开模式:
- ‘c’:如果文件不存在则创建允许读写
- ‘r’:只读
- ‘w’:可读可写
- ‘n’:每次调用open()函数都重新创建一个空文件,可读可写。
protocol:序列化模式,可以是1或2,默认None
writeback:是否将所有从二进制文件中读取的对象存放到一个内存缓存,默认False
|
|
|
csv文件操作:
csv(comma separated values,逗号分隔值)文件是一种常用的文本格式文件,用于存储表格数据,包括数字,字符等。python内置了csv模块处理csv文件常用函数如下:
- csv.writer(csvfile):返回一个witer对象。csvfile为打开的csv文件对象
- writer.writerow(row):写入一行到csv文件
- writer.writerows(rows):写入多行到csv文件
- csv.reader(csvfile):返回一个reader对象来读文件