文件操作基础
文件操作基础
文件操作
文件是操作系统暴露给用户操作硬盘的快捷方式
代码打开文件的两种方式
直接打开模式
open(r'文件路径','打开模式') # 建议加上r
上下文管理模式推荐使用这个
with open(r'文件路径','打开模式') as f,open(r'文件路径','打开模式') as f2:
#子代码 上下文支持同时打开多个文件以逗号分隔
文件读写
'r'读
只读不能写
文件不存在报错
文件存在正常读取
with open(r'a.txt','r','utf-8') as f
f.read()
'w'写
只写不能读
文件不存在创建文件打开
文件存在清空文件内容
with open(r'a.txt','w','utf-8') as f
f.write('追加数据')
'a'追加
只在在文件最后写入数据
文件不存在创建文件
文件存在在最后追加数据
with open(r'a.txt','a','utf-8') as f
f.write('我在最后')
文件操作模式
open 默认打开模式为文本模式 rt wt at
文本模式
rt wt at
只能操作文本文件
文本模式读写以字符为单位
需要指定打开编码 encoding='utf-8' 如果不指定者使用计算机默认编码
二进制模式
rb wb ab
什么文件都能操作
读写以字节为单位
不能指定打开编码,因为已经是二进制模式了
二进制模式与文本模式针对路径是否存在的情况下 规律是一样的
文件的方法
读方法
1.read()
一次性读取文件所有数据并且光标停在最后 继续读取则没有内容
并且当文件内容比较多的时候 该方法还可能会造成计算机内存溢出
括号内还可以写数字 在文本模式下以字符为单位,表示读取几个字符 在字节模式下,表示读取几个字节
2.for循环
一行一行读取文件避免内存溢出现象的产生
3.readline()
一次读取一行
4.readlines()
一次读取所有行,按照行数,放在一个列表里
5.readable()
检查是否可读
写方法
1.write()
写入数据
2.writelines()
传入列表,一次性将列表的所有数据写入文件
3.writeable()
检查文件是否可写
4.fluse()
立即将内存的数据刷入到文件,等于ctrl + s
文件内光标的移动
seek()
两个参数
第一个参数是偏移量
都是以字节偏移
第二个参数是,参考位置
0 文本二进制都可用为文件头
1 只能二进制当前光标的位置
2 只能二进制文件末尾位置
tell()
返回当前光标距离文件头的距离
文件光标实战
import time
with open('b.txt', 'rb') as f:
f.seek(0,2)
while True:
res = f.readline()
if len(res) > 0:
print(res.decode('utf-8'))
time.sleep(0.5)
计算机硬盘修改数据的原理
硬盘写数据可以看作成是在硬盘刻字 一旦需要修改中间内容 则需要重新刻字
因为刻过的字不能从中间在分开
硬盘删除数据的原理
不是直接删除数据而是该变状态 等着后续数据的覆盖才会被真正删除
文件内容修改
#方法1覆盖修改
with open(r'b.txt', 'r', encoding='utf8') as f1:
res = f1.read().replace('111', '2222')
with open(r'b.txt', 'w',encoding='utf8') as f2:
f2.write(res)
#修改文件内容方式:换地写
with open(r'b.txt', 'r', encoding='utf8') as f1,open(r'c.txt', 'w',encoding='utf8') as f2:
for i in f1:
f2.write(i.replace('222','qwe'))
import os
os.remove(r'b.txt')
os.rename('c.txt','b.txt')
作业
'''
1.编写简易版本的拷贝工具
自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
任何类型数据皆可拷贝
ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
'''
# old_file_path = input('需要拷贝的文件路径')
# new_file_path = input('需要拷贝到的文件路径')
# # 第一种方法
# # with open(fr'{old_file_path}', 'rb') as f1, open(fr'{new_file_path}', 'wb') as f2:
# # f2.write(f1.read())
# 第二种
# import os
# with open(fr'{old_file_path}', 'rb') as f1:
# data = f1.read()
# with open(fr'aa.txt','wb') as f2:
# f2.write(data)
# os.remove(fr'{old_file_path}')
# os.rename(fr'aa.txt',fr'{new_file_path}')
'''
2.利用文件充当数据库编写用户登录、注册功能
文件名称:userinfo.txt
基础要求:
用户注册功能>>>:文件内添加用户数据(用户名、密码等)
用户登录功能>>>:读取文件内用户数据做校验
ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
拔高要求:
用户可以连续注册
用户可以多账号切换登录(多用户) 文件内有多个用户信息
ps:思考多用户数据情况下如何组织文件内数据结构较为简单
提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
'''
while True:
print('''
1.注册
2.登录
''')
input_num = input('请输入编号')
import os
if not os.path.exists(r'a.txt'):
open('a.txt','w').close()
if input_num == '1':
with open(r'a.txt', mode='r', encoding='utf-8') as f1:
while True:
name = input('用户名q')
if name.upper() == "Q":
break
pwd = input('密码')
for i in f1:
if name in i:
print(f'{name}用户名存在')
break
else:
with open(r'a.txt',mode='a',encoding='utf-8') as f2:
f2.write(f'{name}|{pwd}\n')
print(f'{name}注册成功')
elif input_num == '2':
with open(r'a.txt', mode='r', encoding='utf-8') as f1:
while True:
name = input('用户名')
if name.upper() == 'Q':
break
pwd = input('密码')
for i in f1:
data = i.split('|')[0]
if name == i.split('|')[0] and pwd == i.split('|')[1].strip():
print(f'{name}登录成功')
break
else:
print('登录失败')
else:
print('输入有误请重新输入')