文件操作
一、数据持久化
1.计算机存储数据
-
默认情况下程序中的数据是保存在运行内存中,当程序运行结束,在运行内存中保存的数据会自动销毁。如果这次运行程序想使用上一次运行程序产生的数据,就必须把数据保存在硬盘(磁盘)中。
-
硬盘保存数据的最小单位:文件。
2.数据持久化 - 将数据以文件形式保存在硬盘中
- 文件操作将程序中的数据保存到文件中
- 文件操作在程序中获取文件中的内容
3.文件操作
-
基本流程:打开文件 -> 文件读写操作 -> 关闭文件
a.打开文件
open(file, mode='r', *, encoding=None) 以指定方式打开指定文件,返回一个文件对象
参数解释: 1)file:需要打开的文件路径(可以写绝对路径或者相对路径) 绝对路径:文件在计算机中的全路径 相对路径(常用):在写文件路径时用'.'开头代表当前目录,'..'开头代表当前目录的上一目录 (当前目录指的是当前代码文件所在的文件夹) 注意:如果使用相对路径,被打开的文件必须放在工程中。 如果路径是以'./'开头的,'./'可以省略。 # a.路径写法(路径要存在) # 绝对路径 open(r'D:\Python-code+PyCharm项目\python\01语言基础\day15-文件操作\files\abc.txt') # 相对路径 open('./files/abc.txt') # '.' open('../day15-文件操作/files/abc.txt') # '..' 2)mode:文件打开方式,用来决定:打开文件之后能做什么(读or写)、操作文件时数据对应的类型(字符串or二进制) 给mode赋值时需要两组值: 第一组:决定打开之后能做什么对应的值 r:只读;打开不存在的文件,会报错! w:只写:打开时会先清空原文件的内容;打开不存在的文件时会创建新的文件。 a:只写:打开时不会先清空原文件的内容 第二组:决定操作文件时数据的类型,默认是t t:字符串 b:二进制(bytes) 赋值的时候上面两组值每一组都必须选择一个(第二组值不选,相当于选的是't') rt(tr)、rb(br)、r 、wt、wb、w、at、ab、a # b.打开方法 # ======r是只读====== f = open('./files/abc.txt', 'r') f.read() f.write('123677') # io.UnsupportedOperation: not writable # =======w是只写,并且会清空原文件====== f = open('./files/abc.txt', 'w') # 文件里的内容没了 f.write('abdfd3dsss') f.read() # io.UnsupportedOperation: not readable # ======a只写,不会清空原文件====== f = open('./files/abc.txt', 'a') # 文件里的内容还在 f.write('123456') f.read() # io.UnsupportedOperation: not readable # ======带t和不带t对应类型都是字符串====== f = open('./files/abc.txt', 'rt') result = f.read() print(type(result)) # <class 'str'> # ======b对应类型是二进制====== f = open('./files/abc.txt', 'rb') result = f.read() print(type(result)) # <class 'bytes'> # 文件不存在时写 f = open('春晓.txt', 'wt', encoding='utf-8') f.write('\t春晓\t\n春眠不觉晓,\n处处闻啼鸟。\n夜来风雨声,\n花落知多少。') # 文件不存在时读:会报错 f = open('./test.txt', 'rt') f.read() # No such file or directory: './test.txt' 3)encoding:文本文件编码方式(只有以t的方式打开文件时,才需要设置encoding) 一般赋值为'utf-8', 'gbk'(也是一种常见的文件编码方式) utf-8:文本数据在存储时,ASCII表中的符号用一个字节存储,一个中文用3个字节存储。可以对任何符号编码。 gbk:文本数据在存储时,ASCII表中的符号用一个字节存储,一个中文用2个字节存储。可以对任何符号编码。除了ASCII表和中文外,不能对其他符号编码。 使用编码值的原则:存储数据时使用编码值要和获取数据时对应的编码一致。 # c.设置encoding f = open('files/students.txt', 'w', encoding='utf-8') f.write('acdMilo画画') f = open('files/students.txt', 'r', encoding='utf-8') print(f.read()) # acdMilo画画 f.readline() f.readlines()
-
文件读写操作
a.文件读操作:
1)文件对象.read(): 获取整个文件的内容(从读写位置开始,读到文件结束。读写位置默认在文件开头,随着读操作的进行,读写的位置会不断改变)。
2)文件对象.readline(): 获取一行内容(只能文本文件有效)
3)文件对象.readlines(): 获取整个文件内容,返回一个列表,列表中的元素是每一行内容。(只能文本文件有效)
# =====读操作==== f = open('春晓.txt', 'r', encoding='utf-8') result1 = f.read()
b.文件写操作文件对象.write(数据):文件对象.writelines([])
f = open('test.txt', 'a', encoding='utf-8') f.write('abc')
-
关闭文件
文件对象.close()
f = open('春晓.txt', 'r', encoding='utf-8') result1 = f.read() # 关闭 f.close()
二、数据持久化步骤
1.确定需要持久化的数据
2.创建保存需要持久化数据的文件
3.确定文件初始内容(需要持久化的数据的初始值)
4.在程序中需要这个数据时从文件中获取这个数据
5.在程序中修改数据后,必须将最新的数据写入文件。
# 文件读写操作的应用
# 案例:写程序打印程序运行次数
# 1)确定需要持久化的数据 - 运行次数
# 2)创建保存需要持久化数据的文件
# runCount.txt
# 3)确定文件初始内容(需要持久化的数据的初始值)
# 0
# 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()