默认情况下程序中的数据是保存在运行内存中,当程序运行结束,在运行内存中保存的数据会自动销毁。如果这次运行程序想使用上一次运行程序产生的数据,就必须把数据保存在硬盘(磁盘)中。
硬盘保存数据的最小单位:文件。
基本流程:打开文件 -> 文件读写操作 -> 关闭文件
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)) #
# ======b对应类型是二进制======
f = open('./files/abc.txt', 'rb')
result = f.read()
print(type(result)) #
# 文件不存在时写
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()