七 文件操作
7.1 数据持久化
1.计算机存储数据
默认情况下程序中的数据是保存在运行内存中的,当程序运行结束,在运行内存中保存的数据会自动销毁。
如果希望在这次运行程序的时候可以使用上次运行程序产生的数据就必须把数据保存在硬盘中或者磁盘中。
硬盘保存数据的最小单位是文件。
2.数据持久化 - 将数据以文件的形式保存在硬盘中
1)怎么将程序中的数据保存在文件中?
2)怎么在程序中获取文件中的内容?
答案:文件操作
3.文件操作 - 操作文件内容
基本流程:打开文件 -> 文件读写操作 -> 关闭文件
1)打开 - open()
open(file , mode=‘r’ , * , encoding=None) - 以指定的方式打开指定的文件,返回一个文件对象
说明:
参数1:file - 需要打开的文件路径(绝对路径、相对路劲)
绝对路径:文件在计算机中的全路径(window从盘开始写的路径)
相对路劲:在写文件路径的时候可以用“.”开头代表当前目录或者“…”开头代表当前目录的上层目录
(当前目录指的是当前代码文件所在的文件夹)
注意:如果要使用相对路劲,被打开的文件必须放在工程中
如果路径是./开头的可以省略
参数2:mode - 文件打开方式,用来决定打开文件之后能做什么(读还是写);操作文件的时候数据对应的类型(字符串、二进制)
赋值的时候需要两组值:
第一组:决定打开后能做什么对应的值(必须三选一)
r - 只读;文件不存在的时候,报错!!!
w - 只写;打开的时候清空原文件内容;文件不存在的时候,自己创建对应的文件
a - 只写;打开的时候不会清空原文件内容,文件不存在的时候,自己创建对应的文件
第二组:决定操作文件的时候数据对应类型(二选一)
t - 字符串 (默认选的)
b - 二进制(bytes)
赋值的时候上面两组值每一组都必须选择一个(如果第二组值不选,就相当于选的是’t’)
参数3:enconding - 文本文件编码方式(只有在以t的方式打开文件的时候,才需要设置encoding)
一般赋值为’utf-8’、'gbk’也是常见的文件编码方式
‘utf-8’ -在文本数据在存储的时候,asci表中存储字母数字用1个字节,存中文的时候用3个字节,可以对任何符号编码
‘gbk’ - 在文本数据在存储的时候,asci表中存储字母数字用1个字节,存中文的时候用2个字节,除了asci表和中文以外不能对
其它符号编码
使用编码值的原则:存储数据的时候使用编码值要和获取数据的时候对应的编码值一致。
#参数1:路径的写法
open(r'E:\千峰-数据分析\01语法基础\day15 文件操作\files\abc.txt')#绝对路径
open(r'./files/abc.txt')
open(r'files/abc.txt') #省略./
open(r'01review.py')
open(r'../day15 文件操作/files/abc.txt')
# 参数2:打开方式
# =====r是只读======
f = open('files/abc.txt','r')
print(f.read())
# =====w是只写======并且清空原文件
f = open('files/abc.txt','w')
f.write('123aaabbbccc')
# =====a是只写======不会清空原文件
f = open('files/abc.txt','a')
f.write('ddd')
# =====t对应的类型是字符串======
f = open('files/abc.txt','rt')
result = f.read()
print(result,type(result))
f = open('files/abc.txt','rb')
result = f.read()
print(result,type(result))
f = open('files/abc.txt','wt')#因为t必须是字符串才行
# f.write(1) #报错
# 参数3:enconding
f = open('files/abc.txt','w',encoding='utf-8')
f.write('abc,123,一二三')
f = open('files/abc.txt','r',encoding='utf-8')
print(f.read())
f = open('files/abc.txt','w',encoding='gbk') #出现乱码是因为encoding='gbk'
f.write('abc,123,一二三')
2)文件读写操作
1.文件读操作
文件对象.read() - 获取整个文件内容(针对所有文件)(从读写位置,读到文件结束,读写位置在文件开头,随着读操作的进行读写位
置会不断变化)
文件对象.readline() - 获取一行内容(只能文本文件有效)
f.seek(0) -将读写位置移动在开头
文件对象.readlines() - 获取整个文件内容,返回一个列表,列表中的元素是每行的内容(只能文本文件有效)
2.文件写操作
文件对象.write(数据)
文件对象.writelines(数据)
# 读操作
f = open('files/abc.txt','r',encoding='utf-8')
result = f.read()
print(result)
# 同时读时,上面的光标已经从开始到结尾后面,下面继续读是从文件结束开始读
f = open('files/abc.txt','r',encoding='utf-8')
result = f.readline()
print(result)
# 写操作
f = open('files/abc.txt','a',encoding='utf-8')
f.write('aaa')
f.writelines(['python\n','C\n','C++\n'])
3)关闭文件
文件对象.close() - 文件用完要关
f.close()
练习题:
# 1.数据持久化步骤:
"""
1)确定需要持久化的数据
2)创建保存需要持久化数据的文件
3)确定文件初始内容(就是需要持久化的数据的初始值)
4)在程序中需要这个数据的时候从文件中获取这个数据
5)在程序中修改数据后,必须将最新的数据写入到文件中
"""
# 案例:写程序打印程序运行次数
# 1)确定需要持久化的数据 - 运行次数
# 2)创建保存需要持久化数据的文件
# 3)确定文件初始内容(就是需要持久化的数据的初始值)
# 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))
# 练习1:提示用户输入名字,添加学生,添加完后打印已经添加过的所有的学生的名字
# 方法一:
name = str(input('请输入学生名字:'))
with open('files/name.txt','a',encoding='utf-8') as f:
f.writelines(name + ' ')
with open('files/name.txt','r',encoding='utf-8') as add:
print(add.read())
# 方法二:
name = str(input('请输入学生名字:'))
with open('files/name.txt','a+',encoding='utf-8') as f:
f.writelines(name + ' ')
f.seek(0)
print(f.read())