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