100.file文件操作
目录
open() 函数
- 用于打开一个文件,返回一个文件对象。
- 如果文件无法被打开,会抛出OSError
- 执行open()函数,就要执行close()函数,进行保存
完整语法
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- r :以读取的方式打开文件。
- w :以写入的方式打开文件,若文件存在就覆盖文件内容,若文件不存在就创建文件。
- a :以写入的方式打开文件,若文件存在就在文件内容最后追加新内容,若文件不存在就创建文件。
- x :创建一个文件,并以写方式打开。
- b :以binary(二进制)方式写入。
- t :以文本方式打开
- +:可读可写
- buffering: 设置缓冲
- encoding: 一般使用utf8
- errors: 报错级别
- newline: 区分换行符
- closefd: 传入的file参数类型
代码例子
- f(实例)被称为句柄
- r后面跟的字符串不进行转义(可不加)
f = open(r"./TEXT.txt", mode="w")
f.close()
with语句
- with语句使用的技术是一种上下文管理协议的技术(ContextManagementProtocal)
- 自动判断文件的作用域,自动关闭打开的文件句柄,不需要在使用close()函数。
- 推荐使用此语句打开文件
with open(r"./TEXT.txt", "r") as f:
pass
文件读操作
.read(file)函数
- 按字符读取内容。
- 可以输入参数设置一共读取的字符个数,默认从头到尾。
with open(r"./TEXT.txt", "r") as f:
l = f.read(5)
print(l)
.readline(file)函数
- 按行读取
with open(r"./TEXT.txt", "r") as f:
l = f.readline()
while l :
print(l)
l = f.readline()
- 用list也能达到同样效果
with open(r"./TEXT.txt", "r") as f:
l = list(f)
for i in l:
print(i)
.seek(offset, from)函数
- 移动文件的读取指针
- offset :指针的偏移量
- 正数为右偏移
- 负数为左偏移
- from :偏移起始位置
- 0 :从文件头开始偏移
- 1 :从文件当前位置开始偏移
- 2 :从文件末尾开始偏移
- 移动的单位为字节
with open(r"./TEXT.txt", "r") as f:
f.seek(4, 0)
print(f.read(1))
.tell()函数
- 返回文件读取指针的当前位置
- 返回值单位为byte
with open(r"TEXT.txt", "r") as f:
s = f.read(3)
print(f.tell())
文件的写操作
.write(str)函数
- 把字符串写入文件
- str参数只能是字符串
with open(r"TEXT.txt", "a") as f:
s = "面朝大海,春暖花开"
f.write(s)
.writelines(str)函数
- 把字符串按行写入文件
- str参数可以是字符串,也可以是字符序列
with open(r"TEXT.txt", "a") as f:
s = ["面朝大海","春暖花开"]
f.writelines(s)
pickle模块
- python的序列化模块
- 序列化:把程序运行中的信息保存在磁盘上
- 反序列化:把磁盘上的信息读取到程序中
- 可以保存简单信息,也可以是一个类的实例
- 所有原生类型:布尔值,整数,浮点数,复数,字符串,字节,None。
- 原生类型组成的列表,元组,字典和集合等序列。
- 函数,类,类的实例。
pickle.dump(obj, file, [,protocol])函数
- boj :被存储的数据
- file : 被存入数据的文件
- protocol :数据存储时使用的编码
- 值0 :使用ASCII编码(默认)
- 值1 :使用旧二进制编码
- 值2 :使用新二进制编码(比旧二进制更高效一些)
import pickle
age = 20
l = ["面朝大海","春暖花开"]
with open(r"./TEXT.txt", "wb") as f:
pickle.dump(age, f)
pickle.load(file)函数
- file : 要读取数据的文件
import pickle
with open(r"./TEXT.txt", "rb") as f:
age = pickle.load(f)
print(age)
shelve模块
- 序列化模块,本质时一个数据库
- 类似dict,以key值对的形式系列化数据
特性
- 不支持多个应用程序并行写入,可以多个应用读取,加参数flag="r".
- 写回问题:修改其中数据库键值内容后就执行了close(),但修改的内容还在内存中,并没有存入数据库,用writeback=Ture参数解决。
shelve.open(file)&chelve.close()函数
- 可以使用with语句
- open()与close()必须成对出现。
- 若中途报错,如访问了不存在key值,会报错,无发完成close(),所以有必要进行特殊处理。
#存储
import shelve
with shelve.open(r"./t.db") as sh:
sh["a"] = 1
sh["b"] = 2
#读取
sh1 = shelve.open(r"t.db", flga="r")
try:
print(sh1["a"])
print(sh1["b"])
except Exception as error:
print("报错")
finally:
sh1.close()