1.文件操作
1)数据存储和数据本地化(数据持久化)
程序中产生的数据默认都是保存在运行内存中的,这些数据在程序运行结束后自动销毁
如果希望数据在程序结束后不销毁,就必须将数据存储在硬盘中(通过文件来存)
txt文件、json文件、plist文件、各种数据库文件
图片文件(png、jpg、jpeg)、视频文件、音频文件
2)怎么把数据保存在硬盘中
基本步骤:打开文件(创建文件) -> 操作文件(读操作/写操作) -> 关闭文件
3)打开文件
1)方法
open(file, mode='r', encoding=None,...) - 以指定的方式打开指定文件并且返回文件对象
a.file - 字符串,本地文件路径,可以是绝对路径也可以是相对路径
绝对路径:文件在计算机上的全路径
相对路径:相对当前目录(代码文件所在的目录)
./ - 代表当前目录
../ - 代表当前目录的上层目录
.../ - 代表当前目录的上层目录的上层目录
b.mode - 字符串,读写方式;决定打开文件后能做什么,以及读写的数据是类型
'r' - 只读; 'w' - 只写(清空原文件); 'a' - 只写; 'b' - 二进制; 't' - 文本(字符串)
注意:'b'和't'中必须有一个,如果不写就是't'
'r'/'rt'/'tr' - 只读,读到的数据的类型是字符串
'rb'/'br' - 只读,读到的数据的类型是二进制
'w'('wt'/'tw') - 只写,写入文件中的数据的类型是字符串;打开后会清空原文件的内容
'wb'/'bw' - 只写,写入文件中的数据的类型是二进制;打开后会清空原文件的内容
'a'('at'/'ta') - 只写,写入文件中的数据的类型是字符串
'ab'/'ba' - 只写,写入文件中的数据的类型是二进制
c.encoding - 字符串,文本文件的编码方式;一般使用'utf-8'
注意:1.二进制数据不能设置encoding(mode带b都不能设置)
2)同一个文件读写时的编码方式必须一致
4)操作文件
1.读操作 - 获取文件中的内容
a.文件对象.read() - 获取指定文件对象中内容(从文件读写位置开始到文件结束),并且返回
b.文件对象.readline() - 读一行内容(从文件读写位置到一行结束),并且返回
print('========读操作========')
f = open('./files/text1', 'r', encoding='utf-8')
content = f.read()
print(content, type(content))
f.seek(0) # 将文件读写位置设置到文件开头
content2 = f.readline()
print('content:', content2)
print(f.read())
# 练习:将文本文件中的内容一行一行的读,读完为止
f = open('./files/text1', 'r', encoding='utf-8')
while True:
content = f.readline()
if not content:
break
print(content)
2.写操作 - 修改文件中的内容
文件对象.write(数据) - 将指定数据写入指定文件;数据只能是结果是字符串的数据或者是二进制数据
print('============写操作============')
f = open('./files/text1', 'w', encoding='utf-8')
f.write('hello')
5)关闭文件
文件对象.close() - 关闭指定文件;文件关闭后不能进行读写操作
f.close()
6)文件作用域
with open(file, mode='r', encoding=None,...) as 文件对象:
文件作用域
文件作用域 - 只有在文件作用域范围内才能操作文件;离开文件作用域,文件会被自动关闭
with open('./files/text1', encoding='utf-8') as f1:
print('文件作用域:', f1.readline())
# f1.seek(0) # ValueError: I/O operation on closed file.
2.数据本地化
1)怎么将数据持久化
1.将需要持久化的数据保存到本地文件中
2.需要使用数据的时候从文件中去读这个数据
3.数据发生改变以后,要将最新的数据更新到文件中
# 练习:写程序,在程序中打印当前程序运行的次数
with open('./files/num', 'r', encoding='utf-8') as f:
num = int(f.read())
print(num)
num += 1
with open('./files/num', 'w', encoding='utf-8') as f:
f.write(str(num))
2)打开不存在的文件
如果以读的形式打开一个不存在的文件,程序会报错
如果以写的形式打开一个不存在的文件,程序不会报错,而且会自动创建这个文件再打开。
注意:如果路径中的文件夹不存在,以写的形式打开还是会报错
补充:eval函数
eval(字符串) - 将字符串转换成列表或者字典;字符串必须是去掉引号后本身就是一个列表或者字典
# 练习:运行程序输入学生的姓名和成绩;输入完成后打印所有学生的信息,要求之前输入的学生信息,后面还能打印
name = input('请输入学生姓名:')
score = float(input('请输入学生成绩:'))
stu = {'name': name, 'score': score}
# 需要数据从文件读出来
with open('./files/student', 'r', encoding='utf-8') as f2:
all_students = eval(f2.read())
# 修改保存的数据
all_students.append(stu)
# # 更新文件
with open('./files/student', 'w', encoding='utf-8') as f2:
f2.write(str(all_students))
for stu in all_students:
print(stu)
3.json数据
1)json数据
json是一种数据格式;
json的数据格式:一个json有且只能有一个数据;这一个数据必须是json支持的数据类型的数据
json支持的数据类型:
数字类型 - 包含所有的数字,小数中支持科学计数法,例如:89, 12.89
字符串 - 使用双引号引起来的数据。‘hello’,'123'
布尔 - 只有true和false两个值
空值 - null
数组 - 相当于python中的列表,[元素1,元素2,...]
字典 - 相当于python中的字典,{key1:value1, key2:value2,...} key只能是字符串
2)json和python相互转换 - json模块
a.json数据转换成python数据(爬虫、数据可视化、数据分析) - json.loads()
json python
数字 int/float
字符串 str;可能会将双引号变成单引号
布尔 bool;true -> True,false -> False
空值 null -> None
数组 list
字典 dict
json.loads(数据) - 将json数据转换成python数据。
数据必须是字符串;字符串中的内容必须是json格式的数据
result = json.loads('true')
print(result, type(result))
result = json.loads('{"name": "ysy", "age": 18}')
print(result, type(result))
b.将python数据转换成json(web后端开发 - 写服务器程序、写接口)
python json
int/float 数字
bool 布尔;True -> true,False -> false
str 字符串;单引号都会变成双引号
None None -> null
list,tuple 数组
dict 字典
json.dumps(数据) - 将python数据转换成json格式的字符串
result = json.dumps(100)
print(result, type(result))
result = json.dumps('100')
print(result, type(result))
result = json.dumps([10, 'abc', None])
print(result, type(result))