python基础知识-文件操作
一.数据存储
1.1.计算机数据存储
计算机内存分为硬盘和运行内存:保存在运行内存的数据在程序结束后会自动释放;保存在硬盘中的数据会一直存在,除非手动删除或者硬盘损坏。
1.2 数据持久化(以文件为单位,将数据保存到硬盘中)
数据持久化又叫数据本地化,指的就是将程序中的数据保存在硬盘中(程序中的数据默认是保存在运行内存中的)
硬盘保存数据的基本单位是文件,所以如果想要把数据保存到硬盘中,就需要把数据保存到文件中
常见的数据持久化:数据库(.db,.sqlite),excel文件,csv文件,txt文件,json文件,plist文件等。
二.文件操作-操作文件内存
1.1 文件操作
(1)文件操作基本步骤:
打开文件->操作文件内容(读操作,写操作)->关闭文件
1)打开文件
语法:open(文件路径,文件打开方式,encoding=文本文件编码方式)
说明:
- 文件路径:文件在计算机中的位置信息
- 文件路径分为两种,相对路径和绝对路径
- 绝对路径:文件在计算机中的全路径
- 相对路径:a.在写路径的时候用.表示当前目录
- b.在写相对路径的时候用…表示当前目录的上层目录
- 路径是以’./‘开头时’./'可以省略
- 注意:使用相对路径之前需要将文件放到工程目录下,用"/"表示层层递进关系
res=open(r"D:\study\dsj19\期末考试流程.txt")#绝对路径
res=open('./study/dsj19/期末考试流程.txt')#相对路径,注意要提前将数据放到工程目录下
-
文件打开方式:-决定了打开文件之能做什么(能读还是能写);还决定操作文件的时候数据的类型(是字符串还是二进制)
第一组值:r,w,a
- r-只读,如果文件不存在会直接报错
- w-只写,打开的时候会先清空原文件;文件不存在就会创建文件
- a-只写,打开的时候不会清空原文件(直接在文件中写);文件不存在就会创建文件
f=open('./study/dsj19/期末考试流程.txt','r')
f.read()#不会报错
f.write()#会报错,在打开文件的时候设置了文件只能读不可写
#同样设置了w的时候不能读,只能写同时会先清空原文件
f=open('./study/dsj19/期末考试流程.txt','r')
#——————————r打开不存在的文件会报错
#——————————以写的方式(w,a)打开一个不存在的文件,程序不会报错,并且会自动创建这个文件
- 第二组值:t,b
- t-字符串类型(读到的数据,和写入的数据必须是字符串)
- b-二进制类型(bytes;读到的数据和写入文件中的数据必须是二进制文件)
- 给打开方式赋值的时候必须在两组织中每一株选一个值;如果第二组不选默认是选择 t:
tr(rt,r),rb(br),wt(tw,w),wb(bw),at(ta,a),ab(ba)
(2)文本文件编码方式
常见计算机内存:
位->1字节(bytes,1字节=8位)->kb(1kb=1024字节)->mb(1mb=1024kb)->G(1G=1024MB)->T(1T=1024G)
不同的文本文件编码方式,在保存同一个符号的编码值得时候采用得字节数不同
常见的文本文件编码方式:utf-8,gbk
utf-8:一个数字和字母采用一个字节保存,一个中文用3个字节
gbk:一个数字和字母采用一个字节保存;一个中文采用2个字节
使用编码值的要求:前后一致(储存数据的时候采用编码值必须和获取数据源的时候采用编码值的方式一致)
file=open(r'./file2/date1.txt','w',encoding="utf-8")
file.write('啊手动阀')
(3)操作文件
1)文件读操作(获取文件内容)
- 文件对象.read()——获取整个文件内容(从读写文件位置开始获取内容到文件结束,读写位置默认是文件开头)
注意:读操作会改变读写位置
文件对象.seek(0)——将读写文件位置移动到文件开头
- 文件对象.readline()——从文件开始位置获取一行内容(再次读会到上一次读结束的位置,直到取完,取完时显示为空)(只针对文本文件有效)
f = open( 'files/data1.txt',encoding='utf-8')
relfult= f.read()
print (result)
#
#f. seek(0)#seek(0)改变文件位置到文件开头
result = f. read()#再一次读文件的时候文件位置会改变,在上一次读结束的位置(默认为到文件结束),所以再一次打印是空
print(result)
# 一行一行的取出date1的内容
file = open(r'./file2/date1.txt', 'r', encoding="utf-8")
while True:
result = file.readline()
print(result)
if len(result) == 0:
break
#锄禾日当午
汗滴禾下土。
谁知盘中餐,
粒粒皆辛苦。
鹅鹅鹅,
曲项向天歌。
白毛浮绿水,
红掌拨清波。
春眠不觉晓,
处处闻啼鸟。
夜来风雨声,
花落知多少。
###方法2 :定义函数用生成器(生成器和迭代器只能在函数中)
2)文件写操作(包括增加内容,修改内容,删除内容)
- 文件对象.write(内容)——将指定内容放到指定文件中)
3)关闭文件(关闭文件之后再去操作文件会报错)
文件对象.close()
1.2 数据持久化
数据持久化方法——让这次运行程序产生的数据可以下一次运行程序时使用
步骤:
第一步:确定需要持久化的数据
第二步:创建文件,并且确定文件初始内容
第三步:做到在程序中需要这个数据的时候从文件中获取这个数据
第四步:做到这个数据如果发生改变,必须将最新的数据更新到文件中
#案例
#写程序打印程序运行次数
#第一步:确定需要持久化的数据--运行次数
#第二步:创建文件,确定文件初始内容
#第三步:获取数据————获取上一次的运行次数
#第四步:数据更新时能将最新数据保存到文件中
# 获取上一次的运行次数
f = open('./file2/RUntime.txt', encoding='utf-8')
count = int(f.read())
f.close()
# 在让次数加一
count += 1
# 打印次数
print(count)
# 更新内容
# 注意只能用w来更新内容,在原本的基础上加1,以文本内容代替次数,每运行一次,count便会加1
f = open('./file2/RUntime.txt', 'w', encoding='utf-8')
f.write(str(count))
#练习:创建文件,从控制台输入数据,当数据更新时,输出所有学生(现在输入的以及之前的)
###方法1
#需要持久化的数据:已经添加过的学生
name = input("请输入需要添加的名字:")
file = open(r'./file2/date1.txt', 'a', encoding="utf-8")
file.write(f"{name},")
file.close()
# 需要用到上一次的数据,就需要先将程序结束
file = open(r'./file2/date1.txt', encoding="utf-8")
name = file.read()
print(name)
### 方法2
name = input("请输入需要添加的名字:")
file = open(r'./file2/date1.txt', encoding="utf-8")
name = file.read()
file.close()
# 需要用到上一次的数据,就需要先将程序结束
file = open(r'./file2/date1.txt', 'w', encoding="utf-8")
file.write(f"{name},")
print(name)
###文件操作实现登录
print(
"""
==================================================================
❀❀ 欢迎来到学生管理系统 ❀❀
1. 登 录
2. 注 册
3. 退 出
===================================================================
请选择(1~3)完成以上提示操作
"""
)
def login():
username = input('请输入用户名:')
password = int(input('请输入密码:'))
try:
f = open('users.txt', encoding='utf-8')
userdata = dict(x.strip().split(":") for x in f)
except FileNotFoundError:
userdata = {}
if username in userdata or userdata[username] == password:
print('登陆成功')
else:
print('用户名或者密码错误')
def register():
username = input('请输入用户名:')
password = int(input('请输入密码:'))
f = open('users.txt', encoding='utf-8')
userdata = dict(x.strip().split(":") for x in f)
if username in userdata:
print('用户名已经存在')
else:
userdata[username] = password
f = open('users.txt', 'a', encoding='utf-8')
f.write(f"{username}:{password}\n")
print("注册成功!")
while True:
choice = input("请选择操作(1.登录 2.注册 3.退出):")
if choice == "1":
login()
elif choice == "2":
register()
elif choice == "3":
print("再见!")
break
else:
print("输入有误,请重新输入!")