文件内光标的移动及数据的修改

本文介绍了Python中文件操作的基本技巧,包括文本和二进制模式下的读取、光标移动以及文件修改。同时,展示了如何实现简单的用户注册和登录功能,涉及文件追加和重命名操作。内容涵盖文件的读写、光标控制、字符串替换及用户管理流程。
摘要由CSDN通过智能技术生成

知识点1:文件内光标的移动

1.1文本模式下

要点:read括号内的数字表示读取几个‘字符


with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f.read(3)  # ai我
    print(data)

1.2.二进制模式下

1> read括号内的数字表示读取几个’字节’(英文一个字节 中文三个字节)

 
with open(r'a.txt', 'rb') as f:
    data = f.read(8)  # ai我们
    print(data.decode('utf8'))

2> tell() 获取光标移动的字节数

with open(r'a.txt', 'rb') as f:
    data = f.read(8) 
    print(f.tell())  # 8

3> seek(offset,whence)

offset 控制光标移动的位移量(字节)
whence 模式
0 基于文件开头移动多少字节
1 基于光标当前所在位置移动多少字节
2 基于文件末尾移动多少字节
1和2只能在二进制模式下使用 0无所谓
总结:切记,二进制模式下是不需要encoding参数的,如果你的文件中有汉字存在,在读的过程中一定要decode解码之后才能正常读出来

# 下面要用到的文本文件里面的内容:ai我们都是中国人
with open('a.txt', 'rb') as f:
    f.seek(0)  # 光标移动到文件开头
    print(f.read(2).decode('utf8'))  # ai
    f.seek(3, 1)  # 1光标在当前位置  3光标向后移动3个字节
    print(f.read(9).decode('utf8'))  # 们都是
    f.seek(-9, 2)  # 2光标在文件末尾  -9光标向前移动9个字节
    print(f.read(9).decode('utf8'))  # 中国人
       

知识点2.文件内数据修改

2.1 覆盖写

优点:硬盘只占用一块空间
缺点:数据量较大的时候会造成内存溢出


with open('a.txt', 'r', encoding='utf8') as f:
    data = f.read()
    # print(data)
    new_data = data.replace('小火车', '小卡车')

with open('a.txt', 'w', encoding='utf8') as f:
    f.write(new_data)
 


2.2 重命名

优点:不会造成内存溢出
缺点:有那么一段时间需要占用硬盘两个地方的空间(可能) 也可能是在内存中创建没有刷到硬盘


import os

with open('a.txt', 'r', encoding='utf8') as f1, open('.a.txt.swap', 'w', encoding='utf8') as f2:

    for line in f1:
        f2.write(line.replace('小卡车', '小火车'))
os.remove('a.txt')  # 删除文件
os.rename('.a.txt.swap', 'a.txt')  # 重命名文件


函数练习

# 注册函数
def register():
    username = input('请输入用户名').strip()
    with open('userinfo.txt', 'r', encoding='utf8') as f:
        for i in f:
            # print(i)
            real_name = i.split('|')[0]
            if username == real_name:
                print('该用户名已存在')
        else:
            password = input('请输入密码').strip()
            new_data = f'\n{username}|{password}'
            with open('userinfo.txt', 'a', encoding='utf8') as f1:
                f1.write(new_data)
                print(f'用户{username}注册成功')


# 登录函数
def login():
    username = input('请输入用户名').strip()
    password = input('请输入密码').strip()
    new_data = f'{username}|{password}'
    with open('userinfo.txt', 'r', encoding='utf8') as f:
        for i in f:
            if new_data == i.strip():
                print(f'用户{username}登录成功')
                break
        else:
            print('用户名或密码错误')


while True:
    print(
        """
        1:注册
        2.登录
        3.退出
        """
    )

    choice_num = input('请输入你的选择').strip()
    # 1.注册
    if choice_num == '1':
        register()
    # 2.登录
    if choice_num == '2':
        login()
    # 3.退出
    if choice_num == '3':
        print('程序退出')
        break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值