一、文件操作
1. 数据持久化
计算机内存分为两种:运行内存、硬盘(磁盘)
1)保存在运行内存中的数据在程序运行结束后会自动销毁;
2)保存在硬盘中的数据除非人为删除或者磁盘损坏,否则会一直存在;
3)程序中的数据默认是保存在运行内存中的。
- 数据持久化就是将数据以文件的形式保存到硬盘中。(保存到硬盘中的数据才能做到,这次运行程序产生的数据在下一次运行程序的时候还能使用)
2. 文件操作 - 打开文件后,操作文件中的内容
文件操作基本流程:打开文件 --> 操作文件(读操作和写操作) --> 关闭文件
2.1 打开文件
open(file, model=‘r’, *, encoding=None) - 以指定的方式打开指定文件,并且返回文件对象
1. file - 需要打开的文件的路径(文件地址)
1) 绝对路径 - 文件在计算机中的全路径(windows从盘开始写,mac从user开始写)
使用绝对路径
open(r'/Users/yawenwu/Desktop/千峰学习/自己的代码/01语言基础/Day13-文件操作/files/data.txt')
2) 相对路径 - a.写路径的时候用.开头表示当前目录(当前写代码的文件所在的文件夹)
使用相对路径
open('./files/data.txt')
3) 相对路径如果是以’./‘开头的,’./'可以省略
open('files/data.txt')
4) 相对路径- 打开当前文件夹中的文件
open('./demo.py')
5) …代表当前文件夹的上层文件夹目录
open('../day13-文件操作/files/data.txt')
2. mode - 文件打开方式
-
作用:a.决定打开文件后是能读还是能写
b.同时决定操作文件的时候数据的类型是字符串还是二进制 -
两个作用对应有两组值:
1) 第一组:决定打开后的读写方式
r - 只读;如果文件不存在会报错
w - 只写;打开文件的时候会先清空原文件;如果文件不存在不会报错并且会自动创建文件
a - 只写;打开文件的时候不会清空原文件;如果文件不存在不会报错并且会自动创建文件2) 第二组:决定操作文件的时候数据的类型(str、bytes)
t(默认值) - 字符串类型(操作文件的时候涉及到的数据必须是字符串) - 打开文本文件(word、excel、txt、py)
b - 二进制类型(bytes) - 二进制文件(图片、视频、音频、pdf)只能用b打开 -
注意:给mode赋值的时候必须在两组中每一组选择一个值
‘rt’、‘tr’= ‘r’
‘wt’、‘tw’= ‘w’
1) r是只读的
f = open('files/data.txt', 'r')
f.read
# f.write('xy') # 报错
2) w是只写的,并且会清空原文件
f = open('files/data.txt', 'w')
f.write('xy')
# f.read() # 报错! not readable
3) a是只写的,并且不会清空原文件
f = open('files/data.txt', 'a')
f.write('abc')
# f.read() # 报错! not readable
4) 读的方式打开不存在的文件会报错,写的方式打开不存在的文件不会报错并且会自动创建
# open('files/data1.txt', 'r') # 报错! No such file or directory
# open('files/data2.txt', 'w')
# open('files/data3.txt', 'a')
5) t是字符串
f = open('files/data.txt', 'rt')
result = f.read()
print(type(result)) # <class 'str'>
f = open('files/data.txt', 'at')
f.write('29') # 写的数据只能是字符串
6) b是二进制
f = open('files/data.txt', 'rb')
result = f.read()
print(type(result)) # <class 'bytes'>
f = open('files/data.txt', 'ab')
f.write(bytes('abc',encoding = 'utf-8')) # bytes+str 转二进制
3.编码方式
encoding=‘gbk’
f = open('files/data4.txt', 'w', encoding='gbk')
# f.write('aaa数据实际上是') # 乱码
f = open('files/data4.txt', encoding='gbk')
print(f.read())
encoding=‘utf-8’
f = open('files/data5.txt', 'w', encoding='utf-8')
f.write('aaa数据实际上是') # 不乱码
f = open('files/data5.txt', encoding='utf-8')
print(f.read())
2.2 操作文件
1) 文件读操作
文件对象.read() - 从读写位置开始,读到文件结尾(读写位置默认在文件的开头)
文件对象.readline - 从读写位置开始,读到一行结束
2) 文件写操作
文件对象.write(数据) - 将指定数据写入到指定文件中
f = open('files/test1.txt','rt',encoding = 'utf-8')
result = f.read()
print(result)
移动读写位置到文件开头
f.seek(0)
result = f.read()
print(result)
练习:读test1中的内容,一行一行的读,读完为止
while True:
result = f.readline()
if not result: # 相当于 if result = ' '
break
print(result, end='')
文件写操作
f2 = open('files/data.txt','wt', encoding ='utf-8')
f2.write('hello world!')
f2.write(str([10, 20, 30, 40]))
2.3 关闭文件 - 文件对象.close( )
f2.close( )
# f2.write('ancm') # ValueError: I/O operation on closed file.
# f = open('files/data.txt') # 手动关闭
with open('files/data.txt','r', encoding='utf-8') as f:
print(f.read()) # 自动关闭
# f.read() # ValueError: I/O operation on closed file.
二、数据持久化
1.对程序中对数据做持久化的步骤
第1步:确定持久化对象(到底哪些数据需要持久化)
第2步:创建文件,并且确定文件初始内容
第3步:在程序中需要这个数据的时候从文件中读数据
第4步:在数据发生改变以后需要将最新的数据写入到文件中
练习1:写程序打印程序被执行的次数
# 持久化对象:已经运行过的次数
f1 = open('files/count.txt', encoding='utf-8')
# 获取上一次运行的次数
count = int(f1.read())
count += 1
print(count)
# 保存最新的次数
f2 = open('files/count.txt', 'w', encoding='utf-8')
f2.write(str(count))
f2.close()
练习2:写程序添加学生信息,并且打印已经添加过的所有的学生
第1次运行:
请输入学生姓名: 小明
小明
第2次运行:
请输入学生姓名: 小花
小明 小花
…
# 持久化对象:所有添加的学生的名字
name = input('请输入学生姓名: ')
# 将新添加的学生保存到文件中
f3 = open('files/students.txt', 'a', encoding='utf-8')
f3.write(' ' + name)
f3.close()
# 打印所有已经添加过的学生
f3 = open('files/students.txt', 'r', encoding='utf-8')
print(f3.read())
f3.close()
补充:eval函数
# eval(字符串) - 获取字符串引号中结果
# str(100) -> '100'
# str([10, 20, 30]) -> '[10, 20, 30]'
# eval('100') -> 100
# eval('[10, 20, 30]') -> [10, 20, 30]
# eval('"abc"') -> "abc"
练习3:写程序添加学生信息,并且打印已经添加过的所有的学生
第1次运行:
请输入学生姓名: 小明
请输入学生的成绩: 89
[{‘name’: ‘小明’, ‘score’: 89}]
第2次运行:
请输入学生姓名: 小花
请输入学生的成绩: 100
[{‘name’: ‘小明’, ‘score’: 89}, {‘name’: ‘小花’, ‘score’: 100}]
# 持久化对象:所有已经添加过的学生信息
name = input('请输入学生姓名: ')
score = input('请输入学生成绩: ')
# 获取之前已经添加过的所有学生
f = open('files/students2.txt', encoding='utf-8')
all_student = eval(f.read()) # type: list
f.close()
# 添加这次添加的学生
all_student.append({'name': name, 'score': score})
print(all_student)
# 更新文件
f = open('files/students2.txt', 'w', encoding='utf-8')
f.write(str(all_student))
f.close()