day 15-文件操作
1.数据持续化
1.意义:
将数据以文件的形式保存到磁盘中
程序中的数据默认存储在运行内存中,保存在运行内存中的数据在程序结束后会被自动销毁,就会导致下一次运行程序的时候无法使用上一次程序运行过程中产生的数据。
如果希望这次运行程序还可以使用之前运行这个程序产生的数据,就必须将这个数据以文件的形式保存到硬盘中。(保存在硬盘中的数据,除非手动删除,或者磁盘损坏,数据会一直存在)。
2.数据持久化工具 - 文件
常见的文件:数据库文件(.db、.sqlite等)、excel文件、csv文件、json文件、普通文本文件(.txt)
2.文件操作
1.操作文件内容
文件操作基本内容:打开文件 -> 操作文件内容(读操作、写操作) -> 关闭文件
2.文件操作内容
1)打开文件
open(file, mode=‘r’,*,encoding=None) - 以指定的方式打开文件,返回一个文件对象
a. file | 文件路径(文件在计算机中位置信息),分为绝对路径和相对路径两种 |
---|
1.绝对路径:文件在计算机中的全路径
2.相对路径:使用相对路径的前提:需要打开的文件必须放在工程中
1)用.表示当前目录(当前代码文件所在的文件夹)
2)用…表示当前目录的上层目录
注意:在相对路径的时候,如果路径是以’./‘,开头的’./'可以省略
b. mode | 文件打开方式(决定打开文件后是可以读还是可以写;决定操作文件内容的时候数据对应的类型) |
---|
第一组值 - 决定打开后读写方式
r - 以只读的方式打开文件
w - 以只写的方式打开文件;打开的时候会直接清空原文件内容
a - 以只写的方式打开文件:打开的时候不会删除原文件内容
注意:以读的方式打开一个不存在的文件,会直接报错!以写的方式打开一个不存在的文件,不会报错,并且会自动创建这个文件
第二组值 - 文件数据对应的类型
t - 数据对应的类型必须是字符串
b - 二进制类型的数据(bytes)
所有的文本文件既可以使用t打开也可以便用b打开(一般用t)
二进制文件(图片、视频、音频、压缩包、pdf等)只能用b打开。
给参数mode赋值的时候,必须在这两组数据中每一组选一个值,第二组值可以不选,不选默认是t
赋值的实际写法:r(rt, tr)、br、rb 、w(wt、tw)、 wb、bw、a(at,ta)、ab, ba
c. encoding | 文本文件的编码或者解码方式 |
---|
注意:只有在以t方式打开文件的时候才能设置encoding
常见的文本文件编码方式:utf-8、gbk (建议使用utf-8)
使用原则:必须保证打开文件读数据的时候对应的编码方式和打开文件写入数据的时候对应的编码方式一致。
# =========================路径的写法=====================
# # 绝对路径
# open(r'/Users/mac/work/lessons/Python2203/01语言基础/day15-文件操作/files/静夜诗.txt')
# open(r'/Users/mac/work/lessons/Python2203/Day4 分支和循环作业.md')
#
# # .对应的相对路径
# open('./a.txt')
# open('./files/静夜诗.txt')
#
# # ..对应的相对路径
# open('../day15-文件操作/a.txt')
# open('../day15-文件操作/files/静夜诗.txt')
#
# open('a.txt')
# open('files/静夜诗.txt')
# =======================第一组打开方式的功能==================
# === r的作用 - 只读===
# f = open('./a.txt', 'r')
# print(f.read())
# f.write('xy') # 报错! not writable
# === a: 只写;不会删除原文件内容 ===
# f = open('./a.txt', 'a')
# f.read() # 报错! not readable
# f.write('xy')
# === w:只写;会清空原文件 ===
# f = open('./a.txt', 'w')
# # f.read() # 报错! not readable
# f.write('xy')
# 注意:以读的方式打开一个不存在的文件,会直接报错!以写的方式打开一个不存在的文件,不会报错,并且会自动创建这个文件
# open('./b.txt', 'r')
# open('./c.txt', 'a')
# open('./d.txt', 'w')
# =======================第2组打开方式的功能==================
# ==== t: 字符串 ===
# f = open('./a.txt', 'rt')
# result = f.read()
# print(type(result)) # <class 'str'>
#
# f = open('./a.txt', 'rb')
# result = f.read()
# print(type(result)) # <class 'bytes'>
# ==================读写编码方式必须一致=================
# f = open('./aa.txt', 'w', encoding='utf-8')
# f.write('abc你好!')
# f = open('./aa.txt', 'r', encoding='utf-8')
# print(f.read()) # abc你好!
# f = open('./aa.txt', 'r', encoding='gbk')
# print(f.read())
# f = open('./aa.txt', 'r')
# print(f.read())
2)操作文件
a.文件读操作 - 获取文件内容
文件对象.read() - 获取文件所有内容(从读写位置开始,读到文件结束,读写位置默认开头)
文件对象.readline() - 读一行(从读写位置开始。读到一行),只能读文本文件
文件对象.readlines() -
f.seek(0) - 将读写位置移动到文件开头
b.文件写操作
文件对象.write
# ===== read的用法 =====
# f = open('./a.txt', 'r', encoding='utf-8')
# result = f.read()
# print(result)
# print('------------------------------------华丽的分割线-----------------------------------')
# f.seek(0) # 将读写位置移动到文件开头
# result = f.read()
# print(result)
# ===== readline的用法 =====
# f = open('./a.txt', 'r', encoding='utf-8')
# result = f.readline()
# print(result)
#
# result = f.readline()
# print(result)
#
# result = f.readline()
# print(result)
#
# result = f.readline()
# print(result)
# 案例:读d.txt文件中的内容,一行一行的读,读完为止
# f = open('d.txt', 'r', encoding='utf-8')
#
# while True:
# result = f.readline()
# if not result:
# break
# print('操作:', result)
# ===== readlines的用法 =====
# f = open('d.txt', 'r', encoding='utf-8')
# result = f.readlines()
# # print(result)
# for x in result:
# print('操作:', x.strip())
3)关闭文件
文件操作完成后必须关闭的文件
手动关闭文件:文件对象.close()
自动关闭文件:
with open() as 文件对象:
操作文件
f = open('d.txt', 'r', encoding='utf-8')
print(f.read())
f.close()
# f.read() # ValueError: I/O operation on closed file.
with open('d.txt', 'r', encoding='utf-8') as f:
print(f.read())
print(f.read())
# f.read() # ValueError: I/O operation on closed file.
3.文件操作的具体应用
1.数据持久化方法
第1步:确定需要持久化的数据是什么?
第2步:创建用来保存数据的文件(清楚文件的名字和类型、文件的位置)
第3步:设置文件的初始内容
第4步︰做到在程序中需要这个数据(需要持久化的数据)的时候,从文件中读这个数据;
如果这个数据在程序中发生了改变,必须将最新的数据写入到文件中。
# 案例:写一个程序,打印程序运行次数
# 程序执行的次数就是需要持久化的数据
# 获取上一次运行程序的次数
with open('./files/count.txt', 'r', encoding='utf-8') as f:
count = int(f.read())
# 次数加1
count += 1
with open('./files/count.txt', 'w', encoding='utf-8') as f:
f.write(str(count))
# 打印最新的次数
print(count)
# 案例:写程序添加一个学生,并且打印当前已经添加过的所有学生的名字
请输入学生的姓名:小明
小明
请输入学生的姓名:小花
小明 小花
请输入学生的姓名:张三
小明 小花 张三
# 提示用户输入学生姓名
# name = input('请输入学生的姓名:')
#
# # 打印已经添加过的所有的学生的姓名
# with open('files/names.txt', 'r', encoding='utf-8') as f:
# all_student = f.read()
#
# all_student = all_student + name + ' '
# print(all_student)
#
# with open('files/names.txt', 'a', encoding='utf-8') as f:
# f.write(name)
# f.write(' ')
# name = input('请输入学生的姓名:')
# tel = input('请输入学生的电话:')
#
# with open('files/student.txt', 'r', encoding='utf-8') as f:
# all_student = f.read()
#
# print(all_student)
# print(name, tel)
#
# with open('files/student.txt', 'a', encoding='utf-8') as f:
# f.write(f'{name} {tel}\n')
# ==== 自动创建文件 ===
name = input('请输入学生的姓名:')
tel = input('请输入学生的电话:')
try:
with open('files/student.txt', 'r', encoding='utf-8') as f:
all_student = f.read()
except FileNotFoundError:
# print('文件不存在')
all_student = ''
print(all_student, end='')
print(name, tel)
with open('files/student.txt', 'a', encoding='utf-8') as f:
f.write(f'{name} {tel}\n')