机械硬盘和文件内部修改

昨日内容回顾
-
文件的读写模式
1.为了取消撬棍与字母组合产生的特殊含义 特别在编写文件路径的时候推荐加上r 2.'''with上下文管理''' 支持一次性打开多个文件 3.补充 循环数据类型的时候尽量不要修改数据内部数据的个数 l1 = [1, 2, 3, 4] for i in l1: l1.pop() print(l1) 不能写此类操作1.rt模式 打开文件读取内容 只能读取不能做其他操作
文件路径不存在则报错
2.wt模式打开文件在内部编写数据如果文件路径不存在
创建一个等待编写,如果文件存在则清空内部数据等待编写
3.at模式打开文件追加编写,文件路径不存在创建一个,存在打开文件在末尾等待写入
读写以字符串为单位
读写需要指定参数encoding = 'utf8'
读取较大的文件时不推荐一次性读取
推荐使用for循环读取可以
-
文件操作模式
b模式
二进制模式可以操作所有文件
不需要指定encoding参数
读写都是使用字节为单位bytes
-
文件的诸多方法
rend() 读取 全部光标会停留在末尾继续读取内容为空
write() 写入
rendline() 读取一行
rendlines() 读取全部 制成列表返回
writable() 判断是否可以写
readable() 判断是否可读
seek() 移动光标
tell() 查询移动的位置
with open(r'bbb.txt', 'rb') as f:
f.read()
print(f.tell())
查询光标移动的位置

今日内容概要
昨日作业讲解
# 1.编写简易版本的拷贝工具
# 自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
# 任何类型数据皆可拷贝
# ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
path_file = input('请输入文件路径 >>>:').strip() # 获取用户输入的文件路径路径必须存在否则
trange_path_file = input('请输入路径 >>>:').strip() # 获取用户想要拷贝到的文件路径
with open(r'%s' % path_file, 'rb') as f: # 打开用户输入的文件路径需要用格式化
# 否则无法正确读取到文件路径
# 用户暑输入的路径是个字符串需字符串前使用r来取消一些功能
# with open(r'/Users/ltianhao/PycharmProjects/day13/a.txt', 'r', encoding = 'utf8')
data = f.read()
with open(r'%s' % trange_path_file, 'ab') as j:
j.write(data)
with open(r'/Users/ltianhao/PycharmProjects/day13/2.py','wb' )as f:
pass

2.利用文件充当数据库编写用户登录、注册功能
# 文件名称:userinfo.txt
# 基础要求:
# 用户注册功能>>>:文件内添加用户数据(用户名、密码等)
# 用户登录功能>>>:读取文件内用户数据做校验
# ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
# 拔高要求:
# 用户可以连续注册
# 用户可以多账号切换登录(多用户) 文件内有多个用户信息
# ps:思考多用户数据情况下如何组织文件内数据结构较为简单
# 提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
# with open(r'userinfo.txt', 'w', encoding = 'utf8') as f:
# pass
while True:
print('''
1.用户注册功能>>>:文件内添加用户数据(用户名、密码等)
2.用户登录功能>>>:读取文件内用户数据做校验
''')
chonices = input('input id>>>:').strip()
if chonices == '1':
user_name = input('user_name>>>:').strip()
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for i in f:
real_name = i.strip('\n').split('|')[0]
if user_name == real_name:
print('用户已存在')
break
else:
user_pwd = input('user_pwd>>>:').strip()
user_name_pwd = ('%s|%s' % (user_name, user_pwd))
with open(r'userinfo.txt', 'a', encoding= 'utf8') as f :
f.write('%s\n' % user_name_pwd)
print('用户%s注册成功' % user_name)
elif chonices == '2':
user_name = input('输入用户名>>>:').strip()
user_pwd = input('输入用密码').strip()
with open(r'userinfo.txt', 'r', encoding= 'utf8') as f:
for i in f:
# print(i)
real_name1 = i.strip('\n') # jason|123
real_name2,realpwd4 = real_name1.split('|')
# print((real_name2,realpwd4)) #
if user_name == real_name2 and user_pwd == realpwd4:
print('登陆成功')
break
# if user_name == real_name and user_pwd ==real_pwd:
# print('登陆成功')
# break
else:
print('用户%s登陆失败' % user_name)
elif chonices == '3':
break
else:
print('输入未知选项暂无此功能')
文件内光标操作
文本模式下的操作
with open(r'a.txt','r',encoding ='utf8') as f:
data = f.read()
print(data.decode('utf8'))
括号内部可以填写参数以字符为单位
read内参数以字符为单位移动
二进制模式
with open(r'a.txt','rb') as f:
data = f.read()
print(data.decode('utf8'))
读取以字节为单位read内参数以字节为单位
f.seek(0,0) 第一个参数控制从第几个字符开始读取
f.seek(-6, 1) 从当前光标位置往回退6个字符开
f.seek(-6, 2) 从末尾开始退6个字符
参数1,2 只能在二进制下使用
0无所谓
在二进制模式下read括号内的数字表示读取几个字节(英文一个字节 中文三个字节)
print(f.tlel())获取光标移动的字节



机械硬盘和存储数据原理
机械硬盘存储数据
机械硬盘存储数据是吧原数据抹去再往里面写入数据
数据在内存空间有两种状态,一个叫占有态一个是自由态,一旦从新写入数据如果是遇到占有态则会找其他位置,遇到自由态则将数据抹去然后覆盖写入,我们如果想要删除硬盘内的数据需要将数据改为自由态再用其他数据将其填充之后才算删除,或者使用格式化
文件数据修改
修改文件数据有两种方法
1.方式一覆盖写
with open(r'aaaa.txt','r',encoding = 'utf8') as f:
data = f.read()
kbl = data.replace('鸡哥','叼毛')
with open(r'aaaa.txt','w',encoding = 'utf8') as f:
f.write(kbl)
# 不能写成一行
#有个缺点数据量大的时候会造成硬盘内存溢出,
#硬盘占一块空间
2.方式二重命名
import os
with open(r'bbb.txt','r',encoding = 'utf8') as f,\
open(r'bbb.txt.swap','w',encoding = 'utf8') as f1:
for i in f :
f1.write(i.replace('鸡哥','叼毛'))
os.remove('bbb.txt')
os.rename('bbb.txt.swap','bbb.txt')
# 好处是不会造成内存溢出,打开的时候会占用两个硬盘空间


浙公网安备 33010602011771号