1、文件操作模式
①、文件操作方法: open(fileName,mode):返回一个file对象
②、文件操作模式:
r : 只读
rb: 二进制格式打开用于只读
r+: 读写
rb: 二进制格式用于读写
w: 写入
wb: 二进制格式用于写入
w+: 读写(文件已存在会覆盖)
wb+:二进制格式用于读写
a:追加
a+:读写(文件指针在末尾)
ab+:二进制格式用于追加
2.读写文件
import os
# 拼接路径+创建文件(文件名不区分大小写)
currentPath = os.getcwd()
print(currentPath)
fullPath = currentPath+'/Other/ReadOrWrite.txt'
# 获取文件对象
file = open(fullPath,'w+')
# 文件数据写入
try:
file.write('Hello Python')
except IOError:
print('文件写入失败!!')
finally:
file.close()
# 读取文件
file = open(fullPath,'r+')
fileMessage = file.read()
# 文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的.
file.close()
print(fileMessage)
3.使用 with ...file... as ...访问文件(推荐)
# 使用With语句自动帮助我们调用close方法
with open(fullPath,'r+') as f:
print(r"with open(...) as f:",f.read())
# ValueError: I/O operation on closed file.<读写一个被关闭的文件>
# print(f.read())
# 二进制文件
with open(currentPath+'/Other/CaiBird.jpg','rb') as caiBird:
for i,lineB in enumerate(caiBird.readlines()):
print('第'+str(i + 1)+'行,数据:',lineB)
4.文件常用方法
# 写入文件:需要写入的数据系统会在空闲时进行写入操作,所以文件使用完成一定要关闭,否则会造成写入数据丢失
file.write()
# 写入文件:序列参数
file.writelines()
# 读取文件:会一次性读取所有文件,要特别注意大型文件,建议根据需求使用read(size)、readline()、readlines()等方法
file.read()
# 关闭文件:文件关闭之前会自动将内存中需要写入的数据写入文件
file.close()
# 刷新缓冲:直接把缓冲区的数据立刻写入文件
file.flush()
# 文件描述符:整形
file.fileno()
# 判断文件是否连接终端设备:
file.isatty()
# 设置/获取文件句柄位置
file.seek(offset=2)
file.tell()
# 截断文件:从首行字符开始,截断size个字符,无size标识从当前位置截取
file.truncate(size=100)
5、StringIO和BytesIO(file-like Object)
注:像open()函数返回的这种有个read()方法的对象,在Python中统称为file-like Object。除了file外,还可以是内存的字节流,网络流,自定义流等等
from io import StringIO
from io import BytesIO
# StringIO:在内存中读写字符串(只能是str)
with StringIO('头部信息\n') as fileStr:
# 使用write()之后会覆盖初始化的信息
fileStr.write('Coder')
fileStr.write('_')
fileStr.write('LW\n\n\n')
print(fileStr.getvalue().strip())
# ByteIO:在内存中读写Bytes
with BytesIO('Hello Python'.encode('UTF-8')) as fileByte:
print(fileByte.getvalue())
6、序列化、反序列化 初步体验
import pickle
person = {'name':'Coder_LW','age':22,'height':1.80}
txtPath = os.getcwd()+'/Other/ReadOrWrite.txt'
# 将任意对象序列化成一个Bytes,然后就可以将Bytes写入文件。
bData = pickle.dumps(person)
print('二进制数据:',bData)
print('反序列化数据:',pickle.loads(bData))
os.remove(txtPath)
# 也可将对象序列化成为一个file-like Object
with open(txtPath,'wb+') as txtFile:
# TypeError: write() argument must be str, not bytes
personData = repr(person).encode('UTF-8')
pickle.dump(personData,txtFile,2)
with open(txtPath,'rb+')as tFile:
print('每次写入只有要先关闭再去读取:',pickle.load(file=tFile,encoding='UTF-8'))