ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

文件光标移动与文件数据修改

2022-06-30 21:35:17  阅读:123  来源: 互联网

标签:文件 read --- 修改 print txt data 光标


目录

昨日内容回顾

文件读写模式

  1. r模式---只可以读取文件

    文件路劲不存在的时候---直接报错

    文件存在路劲存在的时候---读取文件

  2. w模式---只可以写入内容,执行的时候先清空内容,然后等待输入新的内容信息

    文件路劲不存在的时候---通过路劲自动创建文件

    文件路劲存在的时候---等待写入新的内容

  3. a模式---只可以写入模式,执行的时候不清空内容,默认在文件内容后面加入新的内容

    文件路劲不存在的时候---通过自动创建文件

    文件路劲存在的时候---在文件内容后面等待加入新的内容

  4. rb,wb---分别于r,w类似,但是用于读写二进制文件

  5. r+ ---可读、可写,文件不存在也会报错,写操作时会覆盖

    文件存在的时候打开文件,光标定位到文件开始位置

    文件不存在,则报错文件不存在

  6. w+ --- 可读,可写,文件不存在先创建,会覆盖

    文件存在的时候,清空内容

    文件不存在的时候,则创建文件

    光标定位到的是开始的位置所以read()会得到空

  7. a+ ---可读、可写,文件不存在先创建,不会覆盖,追加在末尾

    文件存在的时候打开文件,文件指针定位到文件开始位置,但是内容不会清空

    文件不存在的时候,会创建文件

    打开后读取时,光标在文件开头的位置

    写入时,添加到文章末尾,并且指针位于添加后的末尾,再次读取回乱码

文件操作模式

  1. t模式---文本模式

    文本模式是默认模式可以不写,只支持文本文件类型

    必须写好enconding这个参数

    以字符串为单位

  2. b模式---二进制模式

    需要用的时候必须标注好,支持音频、视频、图片等各种类型

    不需要写encoding这个参数

    以bytes为单位

文件操作方法

  1. 可以通过with里的变量名使用for循环处理一些大的数据,每次取出来后会被垃圾回收装置回收,不会浪费资源
  2. .read(),一次性读完文件内容光标移到文件末尾,如果还需要读的话那就读不到内容了
  3. .readline(),一次读取一行内容
  4. .readlines(),一次全部读完,将读取到的内容整理成列表的形式
  5. .write(),每次写入之前都会被清空内容
  6. .writable(),可不可以写入
  7. readable(),可不可以读取
  8. writelines(),支持容器类型写入,例如列表、字典等

作业讲解

#利用文件充当数据库编写用户登录、注册功能
# 	文件名称:userinfo.txt
# 	基础要求:
# 		用户注册功能>>>:文件内添加用户数据(用户名、密码等)
#        用户登录功能>>>:读取文件内用户数据做校验
#       ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
#  	拔高要求:
#        用户可以连续注册
#    		用户可以多账号切换登录(多用户)  文件内有多个用户信息
#       ps:思考多用户数据情况下如何组织文件内数据结构较为简单
#    	提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件

while True:
    print('''
        1.用户注册功能
        2.用户登录功能
    ''')
    funct_choice = input('请输入要执行的操作:').strip()
    if funct_choice == '1':
        # 获取用户的输入
        username = input('输入用户名: ').strip()
        # 读取文件,判断用户是否存在
        with open(r'userinfo.txt', 'r', encoding='utf8') as read_f:
            for info in read_f:
                # 循环切割索引找到名字
                data_name = info.split('|')[0]
                if username == data_name:
                    print('用户已经存在')
                    break
            else:
                password = input('输入密码:').strip()
                # 将用户名与密码改为字符串格式
                user_data = '%s|%s\n' % (username, password)
                # 写入文件中
                with open(r'userinfo.txt', 'a', encoding='utf8') as write_f:
                    write_f.write(user_data)
                print(f'{username}注册成功')
    elif funct_choice == '2':
        login_name = input('请输入用户名:').strip()
        login_pwd = input('请输入密码:').strip()
        with open(r'userinfo.txt', 'r', encoding='utf8') as read_f:
            for info in read_f:
                # 对用户与密码进行切割
                data_name, data_pwd = info.split('|')
                # 判断输入是否正确
                if login_name == data_name and login_pwd == data_pwd.rstrip('\n'):
                    print('登录成功')
                    break
            else:
                    print('用户名或密码有误')
    else:
        print('输入有误')

今日内容

文件内光标的移动

1.文件内光标的移动是以bytes为单位移动的,t模式下的read()是以字符移动的

with open('aaa.txt', mode='rt', encoding='utf-8') as read_f:
    data = read_f.read(3)  # 读取3个字符
    print(data)
image-20220630155328960
with open('aaa.txt', mode='rb') as f:
    data = f.read(3)  # 读取3个Bytes
    data1 = f.tell()  # .tell()可以获取移动的字节数
    print(data)
    print(data1)
image-20220630160250594

2.文件内指针的移动不一定都是有读写操作被动的出发,可以通过一定的方法对其进行指定的移动

.seek(offset(光标移动的字节数,whence(模式控制))

'''0 模式,基于文件开头移动多少个字节,可以在t或者b模式下使用'''
with open(r'aaa.txt', 'rb') as f:
    data = f.read(7)  # aaaa要
    print(data.decode('utf8'))
'''
一个英文字母以一个字节起步
一个中文以三个中文起步
'''
image-20220630162412437
'''1 模式,基于光标当前所在位置移动的多少字节,只能在二进制模式下使用'''

with open(r'aaa.txt', 'r', encoding='utf8') as f:
    data = f.read()  # aaaa要吃中午饭了
    print(data)
    f.seek(0, 0)
    print(f.read())  # aaaa要吃中午饭了
'''2 模式,基于文件末尾移动多少字节使用,只能在二进制模式下使用'''
with open(r'aaa.txt', 'rb') as f:
    data = f.read(4)
    print(data.decode('utf8'))  # aaaa
    # 光标在当前位置进行移动
    f.seek(-3, 1)
    print(f.read().decode('utf8'))  # aaa要吃中午饭
    # 光标在文件末尾移动
    f.seek(-3, 2)
    print(f.read().decode('utf8'))  # 了

文件内数据修改

1.机械硬盘存储数据原理(文件对应的是硬盘空间,硬盘不能直接进行修改文件,断电后文件还存在)

​ 数据的修改---覆盖写,将原来的覆盖掉重新写入

​ 数据的删除---占有态自由态,

2.代码修改文件的方式

​ 方式一:覆盖写

​ 先读取文件内容到内存,在内存中完成修改,之后w模式打开该文件写入

with open(r'demo.txt', 'r', encoding='utf8') as f:
    data = f.read()
new_data = data.replace('美人', '西施')
with open(r'demo.txt', 'w', encoding='utf8') as f1:
    f1.write(new_data)

​ 方式二:重命名

​ 先读取文件内容到内存,在内存中完成修改,之后保存到另外一个文件中

​ 再将原文件删除,将新的文件重命名为原文件

​ 优点:不会造成内存溢出

​ 缺点:有一段时间可能需要占用硬盘两个地方的空间(可能) 也可能是在内存中创建没有刷到硬盘

with open('demo.txt', 'r', encoding='utf8') as read_f, \
        open('.demo.txt.swap', 'w', encoding='utf8') as wrife_f:
    for line in read_f:
        wrife_f.write(line.replace('西施', '美人'))
os.remove('demo.txt')  # 删除文件
os.rename('.demo.txt.swap', 'demo.txt')  # 重命名文件

标签:文件,read,---,修改,print,txt,data,光标
来源: https://www.cnblogs.com/zxr1002/p/16428686.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有