数据持久化
原因:
-
程序中的数据默认保存在运行内存中,在程序运行结束自动销毁,会导致这一次运行数据在下一次运行程序时无法使用
-
如果将数据保存在磁盘中,除了人为删除或者磁盘损坏,数据会一直存在(磁盘是以文件为单位保存数据的)
定义:
- 数据持久化就是指将数据以文件的形式保存到磁盘中
- 常见的数据持久化工具:数据库文件(. db、.sqlite)、 json文件(.json)、 excel文件、csv文件、txt文件、plist文件等
文件操作:操作内容
-
文件操作基本流程:打开文件 --> 操作文件(读、写) --> 关闭文件
-
语法:
open(‘文件位置’,mode = ‘r’,encoding = ‘utf-8’):以指定的方式打开指定文件返回一个文件对象
-
文件位置:
a.绝对路径:文件中的全路径如:r’C:\Users\杨向笙\Desktop\知识回顾\file.txt’,加r阻止转义字符
b.相对路径:(必须将需要打开的文件放在工程目录)
- 写路径的时候用./表示当前目录(当前目录指的是当前代码文件所在的文件夹)
- 写路径的时候用…/表示当前代码文件的上层目录
-
mode:文件打开方式(决定打开方式决定能读还是能写? 决定打开文件后操作文件的时候对应的数据的类型是字符串还是二进制? ))
第一组值(决定读写方式)
- r:只读
- w:只写,覆盖
- a:只写,append的意思,追加
第二组值(决定数据类型的)
-
t(默认):字符串类型
-
b:二进制类型
给mode赋值的是必须在两组值中每组值选择一个选项: ‘rt’、 ‘tr’、 ‘r’、‘W’
注意:打开文件文件可是使用t也可以用b(-般使用t),但是二进制文件(图片、视频、音频
等)只能用b打开
第三组值:
-
文本文件编码方式(只有在以t方式打开文件的时候才需要设置encoding)
-
不同的文本文件编码方式保存同一个字符的时候采用内存大小可能不一样
-
encoding最常见的两种值:
a.utf-8:一个中文字符用3个字节,英文字符是1个字节
b.gbk: 一个中文字符用2个字节,英文字符是1个字节
使用原则:数据写入文件采用的编码方式要和读文件数据对应的编码方式一致
-
读取文本数据
- read一次性读取(读取文件中所有内容),读取出来是字符串
f = open('数据持久化.txt','r',encoding = 'utf-8')
print(f.read())#第一次读取
print(type(f.read()))#<class 'str'>
f.seek(0)#将读写位置移动到0位置,即最开始
print(f.read())#再次读取
# 一定要关闭
f.close()
- readline一行一行读取,返回字符串
f = open('数据持久化.txt','r',encoding = 'utf-8')
print(f.readline())#第一行文本
print(f.readline())#第二行文本
print(f.readline())#第三行文本
print(f.readline())#第四行文本
print(f.readline())
print(f.readline())
f.close()
- readlines一次性读取,读取出来是列表
#读取之后文字中出现\n所以我简单做一下处理
result = f.readlines()
index =0
#简单处理了一下/n字符,将/n字符替换为''
for i in result:
result[index] = i.replace('\n','')
index += 1
print(result)
f.close()
文本文件的写
1.直接write(’num‘)
2.使用writelines写入的也是同一行,一个段落,没有换行效果
# writelines:写入一行
with open('数据持久化.txt','w',encoding='utf-8') as f:
f.writelines("新增:舍利子!是诸法空相,不生不灭,不垢不净,不增不减。")
f.writelines("新增:舍利子!是诸法空相,不生不灭,不垢不净,不增不减。")
f.writelines("新增:舍利子!是诸法空相,不生不灭,不垢不净,不增不减。")
f.writelines('23')
f.close()
with open('数据持久化.txt','r',encoding='utf-8') as f:#读
# print(f.read())
# print(f.readlines())
print(f.readline())
f.close()
3.有换行效果:在文本后添加\n
with open('数据持久化.txt','w',encoding='utf-8') as f:
f.writelines("新增:舍利子!是诸法空相,不生不灭,不垢不净,不增不减。\n")
f.writelines("新增:舍利子!是诸法空相,不生不灭,不垢不净,不增不减。\n")
f.writelines("新增:舍利子!是诸法空相,不生不灭,不垢不净,不增不减。\n")
f.writelines('23\n')
f.close()
with open('数据持久化.txt','r',encoding='utf-8') as f:
print(f.read())
# print(f.readlines())
# print(f.readline())
f.close()
eval用法
本质:就是去掉字符串的引号获取引号中表达式的结果
1.基本用法:将满足某种数据类型结构的数据字符串转换成对应类型的数据
print(type(eval('100'))) # <class 'int'>
print(type(eval('[100]'))) # <class 'list'>
print(type(eval('{100}'))) # <class 'set'>
2.高级用法
print(eval('100+200'))#300
str1 = 'axz'
print(eval('str1[-1]'))#z