文件光标移动与文件数据修改
2022/6/30 23:23:45
本文主要是介绍文件光标移动与文件数据修改,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- 昨日内容回顾
- 文件读写模式
- 文件操作模式
- 文件操作方法
- 作业讲解
- 今日内容
- 文件内光标的移动
- 文件内数据修改
昨日内容回顾
文件读写模式
-
r模式---只可以读取文件
文件路劲不存在的时候---直接报错
文件存在路劲存在的时候---读取文件
-
w模式---只可以写入内容,执行的时候先清空内容,然后等待输入新的内容信息
文件路劲不存在的时候---通过路劲自动创建文件
文件路劲存在的时候---等待写入新的内容
-
a模式---只可以写入模式,执行的时候不清空内容,默认在文件内容后面加入新的内容
文件路劲不存在的时候---通过自动创建文件
文件路劲存在的时候---在文件内容后面等待加入新的内容
-
rb,wb---分别于r,w类似,但是用于读写二进制文件
-
r+ ---可读、可写,文件不存在也会报错,写操作时会覆盖
文件存在的时候打开文件,光标定位到文件开始位置
文件不存在,则报错文件不存在
-
w+ --- 可读,可写,文件不存在先创建,会覆盖
文件存在的时候,清空内容
文件不存在的时候,则创建文件
光标定位到的是开始的位置所以read()会得到空
-
a+ ---可读、可写,文件不存在先创建,不会覆盖,追加在末尾
文件存在的时候打开文件,文件指针定位到文件开始位置,但是内容不会清空
文件不存在的时候,会创建文件
打开后读取时,光标在文件开头的位置
写入时,添加到文章末尾,并且指针位于添加后的末尾,再次读取回乱码
文件操作模式
-
t模式---文本模式
文本模式是默认模式可以不写,只支持文本文件类型
必须写好enconding这个参数
以字符串为单位
-
b模式---二进制模式
需要用的时候必须标注好,支持音频、视频、图片等各种类型
不需要写encoding这个参数
以bytes为单位
文件操作方法
- 可以通过with里的变量名使用for循环处理一些大的数据,每次取出来后会被垃圾回收装置回收,不会浪费资源
- .read(),一次性读完文件内容光标移到文件末尾,如果还需要读的话那就读不到内容了
- .readline(),一次读取一行内容
- .readlines(),一次全部读完,将读取到的内容整理成列表的形式
- .write(),每次写入之前都会被清空内容
- .writable(),可不可以写入
- readable(),可不可以读取
- 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)
with open('aaa.txt', mode='rb') as f: data = f.read(3) # 读取3个Bytes data1 = f.tell() # .tell()可以获取移动的字节数 print(data) print(data1)
2.文件内指针的移动不一定都是有读写操作被动的出发,可以通过一定的方法对其进行指定的移动
.seek(offset(光标移动的字节数,whence(模式控制))
'''0 模式,基于文件开头移动多少个字节,可以在t或者b模式下使用''' with open(r'aaa.txt', 'rb') as f: data = f.read(7) # aaaa要 print(data.decode('utf8')) ''' 一个英文字母以一个字节起步 一个中文以三个中文起步 '''
'''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') # 重命名文件
这篇关于文件光标移动与文件数据修改的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?