文件修改

文件内光标的移动

  • 用.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('指令错误')  # 提示指令错误
posted @ 2022-06-30 22:05  无言以对啊  阅读(205)  评论(0)    收藏  举报