文件内的光标移动
- 我们直接创建一个文本文件a.txt。在a.txt内输入:
a.别人越学越牛逼!
如图:
- 然后进行我们的操作。
文本模式 默认t rt>>>t
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read(5) # 读出来的是5个字符
print(data)
输出结果:
二进制模式 不默认 rb>>>rb
with open(r'a.txt', 'rb') as f:
data = f.read(5) # 读出来是字节,英文1字节,中文3字节
print(data)
** 二进制模式时read()里面的数字会有时因为字节数而报错,所以需要注意输出的字节数能与字符对应出来
输出结果:
tell() 获取光标移动的字节数
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read(3)
print(data) # 输出读到的数据
print(f.tell()) # 获得光标移动的字节数是5
data1 = f.read() # 赋值一个data1,让其接着读取。
print(data1) # 会从光标位置,输出剩下的字符
输出结果:
with open(r'a.txt', 'rb') as f:
data = f.read(5) # 读出来是字节
print(data.decode('utf8')) # 在输出时解码为utf码
输出结果:
seek(offset,whence) 代码控制光标移动
# offset所在位置表示光标移动的字节是多少
# whence是一个模式有3种功能:
# 数字0表示基于文件开头需要移动多少字节
# 数字1表示在当前位置时移动多少字节
# 数字2表示基于文件末尾移动多少字节
***举例:
# seek(3,0)
# seek(3,1)
# seek(3,2)
#3表示光标移动字节,数字0,1,2就是指代功能。但是1,2指代的功能,只能在二进制下使用。所以我们读取时需要二进制模式,解码时有需要转回utf8,不然会报错
0 模式
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f. read(5)
print(data)
f.seek(5, 0)
print(f.read())
输出结果:
1 模式
with open(r'a.txt', 'rb') as f: # 二进制
data = f.read(8)
print(data.decode('utf8'))
f.seek(-6, 1)
print(f.read().decode('utf8'))
输出结果:
2 模式
with open(r'a.txt', 'rb') as f: # 二进制
data = f.read(8)
print(data.decode('utf8')) # 输出转utf8
f.seek(-9, 2)
print(f.read().decode('utf8'))
输出结果:
文件内的数据修改
通过代码实现修改文件时,可以通过两种方式:
- 第一种是覆盖写:
读取文件内容从内存中修改完成以后,使用w模式直接把原文件内容进行替换。
覆盖写的优点:
* 占用空间少
覆盖写的缺点:
* 数据量较大时内存会溢出
例:输入代码:
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read()
new_data = data.replace('别人越学越牛逼!', '我越学越懵逼!')
with open(r'a.txt', 'w', encoding='utf8') as f1:
f1.write(new_data)
输出结果:打开a.txt可以看到里面的一些内容已被更换。
- 第二种是重命名:
读取文件内容从内存中修改完成以后,保存为一个另一个新文件,将原文件删除,把自己的文件名进行修改,替代旧文件。
重命名的优点:
* 不会造成内存溢出
重命名的缺点:
* 可能需要占用两个空间,也可能在内存中创建,没有存储到硬盘。
例:输入代码:
import os
with open('a.txt', 'r', encoding='utf8') as read_f,\
open('.a.txt.swap', 'w', encoding='utf8') as write_f:
for line in read_f:
write_f.write(line.replace('越懵逼!', '越牛逼!'))
os.remove('a.txt') # 删除文件
os.rename('.a.txt.swap', 'a.txt') # 重命名文件
输出结果:
函数简介
- 循环:在相同的位置反复执行相同的代码
完成列表数据值个数统计:
* 自定义统计方法
def my_len():
value_count = 0
for i in l1:
value_count += 1
print(value_count)
- 函数:在不同的位置反复执行相同的代码
如果我们需要多次用到一个功能时。此时就需要用到函数。
* 函数有什么优点呢?
对比我们自定义的方法,调用函数大大增加了我们的工作效率。而且我们自定义写出来的统计方法,只能统计固定数据类型的数据值个数,也没有产生返回值,调用函数就可以避免这一问题。
文件读写模式拓展
读写模式
x模式
- 当文件存在时,无法创建文件。会直接报错
- 当文件不存在时,先创建文件然后写入。 执行代码:
with open(r'b.txt', 'x', encoding='utf8') as f:
f.write('123456')
输出结果:
+模式
- +模式可以与r,w,a组合使用变成r+,a+,w+。主要功能时更新读和写
r+ 可读可写
- 可以读也可以写,但是文件不存在时会报错。
w+ 写读
- 创建新文件,写入,文件不存在会创建,文件存在会覆盖写入内容会覆盖原来内容。
a+ 追加读写
- 写入方式与a模式相同,但是可以进行读取操作。如果刚使用a+打开一个文件,一般不能直接读取。因为光标在内容的末尾。一般需要搭配seek使用
小练习
1.尝试着将今日作业第二题注册、登录功能封装成函数
参考老师博客尝试编写
2.查阅资料或者源码了解更多文件读写模式并写入博客中
查看并优化之前所写所有博客
图文结合 标题排版 代码环境等