文件修改
文件内光标的移动
- 用.read()读取内容
1.在文本模式下用.read()括号内部的数字表示要读取几个字符,若没有字符则全部读取
读取到哪里文件里光标就会停在哪里,继续读取将从光标停止的地方开始
.tell()是用于获取当前光标移动了几个字节
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read(4)
print(data) # run:a阿瓦达
print(f.tell()) # run:10
data1 = f.read()
print(data1) # run:索命
2.在二进制模式下用.read()括号内部的数字表示要读取几个字节,若没有字节则全部读取
读取到哪里文件里光标就会停在哪里,继续读取将从光标停止的地方开始
with open(r'a.txt', 'rb') as f:
data = f.read(4)
print(data.decode('utf8')) # run:a阿
print(f.tell()) # run:4
data1 = f.read().decode()
print(data1) # run:瓦达索命
- .seek()
.seek(控制光标位移的字节,模式)
模式 含义
0 控制光标从文件开头移动多少字节
1 控制光标从光标当前位置移动多少字节
2 控制光标从文件末尾移动多少字节
1和2只能在二进制模式中使用,0都可以使用
3.光标停留在任意位置,0模式都会将光标移回开头在移动
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read(4)
print(data) # run:a阿瓦达
f.seek(0, 0) # 从文件开头移动0的位置开始读取文件
print(f.read()) # run:a阿瓦达索命
1模式会直接在光标当前位置开始移动
2模式会将光标移回末尾在移动
with open(r'a.txt', 'rb') as f:
data = f.read(4)
print(data.decode('utf8')) # run:a阿
f.seek(-4, 1) # 从光标停止的地方向开头移动4个字节
print(f.read().decode('utf8')) # run:a阿瓦达索命
f.seek(-6, 2) # 从文件末尾处先开头移动6个字节
print(f.read().decode('utf8')) # run:索命
文件内数据修改
- 机器硬盘储存数据原理
1.我们平时修改数据,其实并不是直接修改,而是覆盖写
如果我要将一个数据124修改为1234,是将124从硬盘读取的内存,改为1234,在存入硬盘覆盖硬盘原来的124
2.我们删除数据,也不是删除,而是从占有态转为自由态
当数据存储进硬盘时,储存数据的区域变为占有态,当我们把数据删除时,并没有真正删除,只是将占有态转为自由态,在储存新的数据在这个区域时,会将自由态的数据覆盖
- 修改代码的方法
1.覆写法
先将文件读取到内存,在内存中修改,然后在用w模式覆盖该文件
这种方法只会占用一块内存空间,但数据量大的时候会超出内存容量
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read()
print(data) # run:a阿瓦达索命
new = data.replace('阿瓦', 'no') # replace(要更改的数据,更改后的数据)
with open(r'a.txt', 'w', encoding='utf8') as a:
a.write(new)
print(new) # run:ano达索命
2.重命名
先将文件读取到内存,在内存中修改,然后在用w模式保存在另一个文件中,在将原文件删除,将新文件命名为原文件
这种方法不会内存溢出,但可能会占用硬盘两个地方的空间一段时间,也可能在内存中创建没有保存到硬盘
import os
with open(r'a.txt', 'r', encoding='utf8') as f,\
open(r'a.txt.swap', 'w', encoding='utf8') as a:
for i in f:
a.write(i.replace('阿瓦', 'no'))
os.remove('a.txt') # 删除原文件
os.rename('a.txt.swap', 'a.txt') # 重命名新文件
函数简介
- 函数可以在不同的地方反复执行相同的代码
1.def是定义函数的关键字
函数名代指函数体代码
def 函数名():
函数体代码
a = [1, 2, 3, 4, 5]
def my_len():
value_count = 0
for i in a:
value_count += 1
print(value_count)
my_len() # run:5
my_len() # run:5
my_len() # run:5
作业:变为函数
def register():
name = input('请输入用户名>>>:').strip()
password = input('请输入密码>>>:').strip()
with open(r'a.txt', 'r', encoding='utf8') as a:
data1 = a.read() # 将文件内容取出
if name in data1: # 判断输入的新用户是否以存在于文件中
print('用户名已存在')
data = f'{name}|{password}\n' # 不存在则将新用户名字密码组合
with open(r'a.txt', 'a', encoding='utf8') as f:
f.write(data) # 将新用户信息输入文件中
def login():
name2 = input('请输入用户名>>>:').strip()
password2 = input('请输入密码>>>:').strip()
with open(r'a.txt', 'r', encoding='utf8') as b: # 将文件内容取出
for i in b: # 将文件内容以用户信息组依次循环
name_info, password_info = i.split('|') # 将用户信息组的用户名好密码分开赋值
if name2 in name_info and password2 in password_info: # 判断输入的用户名好密码在不在文件内容中
print(f'欢迎{name2}登录!') # 在则登录成功
break
else:
print('账号或密码错误') # 不在则提示错误
while True:
print('''
注册新用户输入1
登录账号输入2
''')
func_id = input('请输入指令>>>:').strip() # 输入指令
if func_id == '1':
register()
elif func_id == '2':
login()
else:
print('指令错误') # 提示指令错误

浙公网安备 33010602011771号