1. 文本文件
文本文件存储常规字符串(指记事本之类编辑器能正常显示、编辑、能直接阅读理解的字符串),由若干文本行组成,每行’\n’结束
内置函数open()
Open()可以指定模式打开指定文件并创建文件对象
语法:
open('文件路径','文件处理方式','编码和解码方式',...)
文件路径:相对路径和绝对路径
文件处理方式:
模式 |
说明 |
r |
读模式(默认,可省略),文件不存在抛异常 |
w |
写模式(文件存在,清空内容;文件不存在,创建文件) |
x |
写模式(文件存在,抛异常) |
a |
追加模式(不覆盖原有内容) |
b |
二进制模式,rb(读),wb(写) |
t |
文本模式(默认,可省略) |
例:
fp=open('file1.txt','w')
注: # 绝对路径写法:'C:\\file1.txt'或r'C:\file1.txt'
# fp这里表示创建文件对象,'file1.txt'表示相对路径
文件常用方法
方法 |
说明 |
close() |
文件写入后,释放文件对象 |
read(size) |
从文件读取size个字符作为结果返回,默认全部 |
readline() |
读取一行内容 |
write(s) |
把字符串s的内容写入文件 |
writelines(s) |
把字符串列表写入文本文件,不添加换行符 |
seek(size,位置) |
二进制模式 |
t |
文本模式(默认,可省略) |
例:
s_str='hello world\n文本文件的读取\n文本文件的写入\n'
# 写
with open('file1.txt','w') as fp:
fp.write(s_str)#将字符串s_str写入
#读,read读取
with open('file1.txt','r') as fp:
print(fp.read(5))#只读5个字符
print(fp.read()) # 一行一行的读
#读,readline读取
with open('file1.txt','r') as fp:
for line in fp:
print(line)
# 同下
# print(fp.readline())
# print(fp.readline())
# print(fp.readline())
注: 1. read和readline()带有下一指针,下一个读取会读取上个余下内容。
2.关键字with,自动管理资源,也叫上下文管理语句,代码异常保证正常跳with块,保证文件正常关闭(用于文件操作,数据库连接等)
2. 二进制文件
二进制文件常见的有(图像文件,音视频文件,可执行文件,资源谇、数据库谇等),二进制文件无法用记事本普通字处理文件进行编辑,无法阅读和理解
使用: pickle标准库读写二进制文件
Pickle提供doump()序列化转化成二进制写入,提供load()反序列化用于读取二进制文件
例:
'''二进制文件'''
import pickle
i=130
d=99.25
s_str1='文本文件'
a_list=[[1,2,3.],[3,4,5]]
b_data=(i,d,s_str1,a_list)
# 创建dat的文件,并以二进制形式写入以上数据
with open('file2.dat','wb') as fp:
try:
pickle.dump(b_data,fp) #序列化对象,并写入
except:
print('文件异常')
# 读取二进制文件
with open('file2.dat','rb') as fp:
try:
print(pickle.load(fp)) # 读取,并反序列化对象,
except:
print('文件异常')
使用: struct模块读写二进制文件
Struct模块使用,需要使用pack()方法进行序列化,unpack()反序列化,使用write()方法写入文件,使用read()方法进行读取
例:
import struct
i=130
d=99.25
b=True
s_str1='文本文件'
# 创建文件,并写入以上数据
# i表示整数,f表示实数,?表示逻辑值
sn =struct.pack('if?',i,d,b)#这里只对前三个进行序列化,字符串,需要改为字节串存入
with open('file3.dat','wb') as f:
f.write(sn)
#字符串转为字节串,
f.write(s_str1.encode())
# 读取文件,
with open('file3.dat','rb') as f:
#这里的9表示字节串长度为9,整数实数各占4个字节,逻辑值占1个字节
sn=f.read(9)
i1,d1,b1=struct.unpack('if?',sn)
print(i1,d1,b1)
#字节串转为字符串
s=f.read().decode()
print(s)
注:struct模块需要区分字节串(像实数、整数、逻辑值,被默认为字节串)与字符串
使用: shelve模块读写二进制文件
例:
import shelve
a_dict={'a':38,'b':40,'c':50}
#写
with shelve.open('file4.dat')as fp:
fp['a_dict']=a_dict
#读
with shelve.open('file4.dat') as fp:
#读取全部
print(fp['a_dict'])
#读取单个
print(fp['a_dict']['a'])
注:shelve模块像字典赋值一样写入二进制文件,读取可以直接给值获得
使用: marshal模块读写二进制文件
例:
import marshal
x1=30
x2=2.5
x3=[1,2,3]
# eval('x'+str(i))表示x1,x2,x3,字符串连接
x=[eval('x'+str(i)) for i in range(1,4)]#将数据存入列表
#创建文件,写
with open('file5.dat','wb') as fp:
marshal.dump(x,fp)
#读取文件
with open('file5.dat','rb') as fp:
print(marshal.load(fp))
注:marshal同pickle用法相似