文件操作
数据持久化
计算机存储数据
默认情况下程序中的数据是保存在运行内存中的,当程序运行结束,在运行内存中保存的数据会自动销毁。
如果希望在这次运行程序的时候可以使用上一次运行程序产生的数据,就必须把数据保存在硬盘(磁盘)中。
磁盘保存数据的最小单位是文件。
数据持久化
数据持久化 - 将数据以文件的形式保存在硬盘中
怎么将程序中的数据保存到文件中?
怎么在程序中获取文件中的内容?
答案:文件操作
文件操作
文件操作 - 操作文件内容
基本流程:打开文件 -> 文件读写操作 -> 关闭文件
打开文件
参数
open(file,mode=‘r’,*,encoding=None) - 以指定的方式打开指定文件,返回一个文件对象
参数1:file - 需要打开的文件路径(文件路径可以写绝对路径,也可以写相对路径)
绝对路径:文件在计算机中的全路径(windows从盘开始写的路径)
相对路径:在写文件路径的时候可以用’.‘开头代表当前目录或者’…‘开头代表当前目录的上层目录
(当前目录指的是当前代码所在的文件夹)
注意:如果要使用相对路径,被打开的文件夹必须放在工程中
如果路径是以’./‘开头的,’./'可以省略
参数2:mode - 文件打开方式,用来决定:打开文件之后能做什么(能读还是能写)、操作文件的时候数据对 应的类型(是字符串还是二进制)
给mode赋值的时候需要两组值:
第一组:决定打开后能做什么对应的值
r - 只读;打开不存在的文件,会报错!
w - 只写;打开的时候会清空原文件内容;打开不存在的文件不会报错,并且会自动创 建这个文件
a - 只写;打开的时候不会清空原文件内容;打开不存在的文件不会报错,并且会自动 创建这个文件
第二组:决定操作文件的时候数据的类型
t - 字符串
b - 二进制(byts)
赋值的时候上面两组值每一组都必须选择一个(如果第二组值不选,就相当于选的是’t’
rt(tr)、rb(br)、r、wt、wb、w、at、ab、a
参数3:encoding - 文本文件编码方式(只有在以t方式打开文件的时候,才需要设置encoding)
一般赋值为’utf-8’,'gbk’也是一种常见的编码方式
utf-8:文本数据在存储的时候,ascii表中符号用一个字节来存储,一个中文用3个字节存 储。可以对任何符号编码
gbk:文本数据在存储的时候,ascii表中符号用一个字节来存储,一个中文用2个字节存储。 除了ascii表和中文以外不能对其他符号进行编码
使用编码值的原则:存储数据的时候使用编码值要和获取数据的时候对应的编码值一致。
-
路径的写法
# 绝对路径 open(r'D:\2Python\pythonProject1\day15文件操作\files\abc.txt') # 相对路径 open('./files/abc.txt') open('./test.txt') open('files/abc.txt') open('test.txt')
-
打开方式
第一组:
a. r是只读
f = open('./files/abc.txt','r') f.read() f.write('123') # 报错!
b. w是只写,并且会清空原文件
f = open('./files/abc.txt','w') f.write('123') f.read() # 报错!
c. a是只写,不会清空原文件
f = open('./files/abc.txt','a') f.write('123') f.read() # 报错!
第二组:
a. t对应的类型是字符串
f = open('./files/abc.txt','r') result = f.read() print(type(result)) # <class 'str'>
b. b对应的类型是二进制
f = open('./files/abc.txt','rb') result = f.read() print(type(result)) # <class 'bytes'> f = open('./files/abc.txt','wb') f.write(100) # TypeError: a bytes-like object is required, not 'int' f.write('100') # TypeError: a bytes-like object is required, not 'str'
-
设置encoding
f = open('files/students.txt', 'w', encoding='utf-8') f.write('abc你好') f = open('files/students.txt', 'r', encoding='utf-8') print(f.read())
文件读写操作
-
文件读操作:
文件对象.read() - 获取整个文件内容(从读写位置开始,读到文件结束,读写位置默认在文件开头, 随着 读操作的进行读写位置会不断改变)
文件对象.readline() - 获取一行内容(只能文本内容有效)
文件对象.readlines() - 获取整个文件内容,返回一个列表,列表中的元素是每一行内容(只能文本内容有效)
f = open('test.txt',encoding='utf-8') result = f.read() print(result) f.seek(0) #让读写位置移动到文件开头 result = f.readline() print(result) result = f.readline() print(result) result = f.read() print(result) f.seek(0) result = f.readlines() print(result)
-
文件写操作
文件对象.write(数据)
文件对象.writelines(列表)
f = open('test.txt','a',encoding='utf-8') f.write('abc\n') f.writelines(['python\n','java\n','h5\n'])
关闭文件
文件对象.close()
f.close()
f.write('nxxxx') # ValueError: I/O operation on closed file.
文件操作实战
数据持久化步骤
1.确定需要持久化的数据
2.创建保存需要持久化的数据 - 次数
3.确定文件初始内容(就是需要持久化的数据的初始值)
4.在程序中需要这个数据的时候从文件中获取这个数据
5.在程序中修改数据后,必须将最新的数据写入到文件中
实例
案例1:写程序打印程序运行次数
# 1)确定需要持久化的数据 - 运行次数
# 4)在程序中需要这个数据的时候从文件中获取这个数据
f = open('files/runCount.txt',encoding='utf-8')
count = int(f.read())
f.close()
count += 1
print(count)
# 5)在程序中修改数据后,必须将最新的数据写入到文件中
f = open('files/runCount.txt','w',encoding='utf-8')
f.write(str(count))
f.close()
案例2:提示用户输入名字添加学生,添加完后打印已经添加过的所有的学生的名字
# 1)确定需要持久化的数据 - 已经添加过的学生的名字
name = input('请输入你的名字:')
# 4)在程序中需要这个数据的时候从文件中获取这个数据
added_name = open('files/all_name.txt',encoding='utf-8').read()+name
print(added_name)
# 5)在程序中修改数据后,必须将最新的数据写入到文件中
f = open('files/all_name.txt','a',encoding='utf-8')
f.write(name+' ')
f.close()