文件光标移动、数据修改和函数简介、语法结构
今日内容总结
一、文件内光标到的移动
二、文件的修改
三、函数简介
四、函数的语法结构
一、文件内光标的移动
1 、简介
haha.txt的内容为:锄禾日当午,上班好幸苦
with open(r'haha..txt','r',encoding='utf8')as f:
print(f.read(3)) # 结果为 锄禾日
# raed在文本模式下,括号内的数字表示的是读取指定的字符个数
with open(r'haha.txt','rb') as f:
print(f.read(3).decode('utf8')) # 结果为 锄
# read在二进制模式下,括号内的数字表示的是读取指定的字节数
# unicode所有的字符都是用2bytes来起步表示
# utf8中文都是用3bytes来表示,英文用1bytes来表示

2 、控制光标的移动
haha.txt的内容为:锄禾日当午,上班好幸苦
with open(r'haha.txt','r',encoding='utf8')as f:
print(f.read(1)) # 结果为锄
f.seek(3,0)
print(f.raed(1)) # 结果为禾
print(f.tell()) # 结果为6
# seek可以控制光标的移动,在文本模式下移动的单位也是字节数
seek(offset,whence) # 两个参数格式
offset:用来控制移动的字节数
whence:控制模式
whence有三个数:
'''
seek中whence位如果没有填写值,默认是0 '''
0 :就是让光标移动到文件开头处
可以支持文本模式和二进制模式
1 :就是让光标停留在当前的位置
只支持二进制模式
2 :就是让光标移动到文件末尾处
只接受二进制模式
""" line可以实时监测文件内是否有新增的内容并打印出来 """

二、文件的修改
冷知识:硬盘有两个形态
占有态和自由态
我们在删除数据时,就是将原来的位置标记为自由态,再下载时新的数据落到这个自由态上面就会直接覆盖
''' 文件数据在硬盘上是刻死的,不可能在中间增加新的内容,只能将老内容移除之后,再刻上新的内容'''
1 、文件修改方法一
1、先将文件内容一次性读写到内存中
2、然后使用只写不读模式,进行修改
优点为:在文件修改过程中同一数据只有一份
缺点为:占内存
方法:
haha.txt:锄禾日当午,上班好幸苦
with open(r'haha.txt','r',encoding='utf8')as f:
data = f.read
open(r'haha.txt','w',encoding='utf8')as f:
f.write(data.replace('锄禾日当午','太阳当空照'))
haha.txt内容为:太阳当空照,上班好幸苦
2 、文件修改方法二
1、用写的模式打开源文件
2、用写的模式打开一个临时文件,一行行读取源文件内容
3、修改完后写入临时文件
4、删除源文件,将临时文件重命名源文件名
优点:不会占太多内内存
缺点:在文件修改过程中同样一份数据存两遍
使用方法:
haha.txt:太阳当空照,上班好幸苦
import os
with open(r'haha.txt','r',encoding='utf8')as read_f,\
open(r'.haha.txt.swap','w'encoding='utf8')as f:
for line in read_f:
write_f.write(line.replace('太阳当空照','锄禾日当午')
os.remove('haha.txt')
os.rename('.haha.txt.swap','haha.txt')
结果为 haha.txt:锄禾日当午,上班好幸苦
三、函数简介
# 函数其实就像是工具,提前定义好之后,就可以反复的使用
查看内部源码=ctrl+左键
l1 = [11, 22, 33, 44, 55, 66]
列表统计我们习惯使用len,还有for循环但for循环不是所有数据类型都可以使用
l1 = 'hello world'
print(len(l1))
def my_len():
n = 0
for i in l1:
n += 1
print('字符串中字符的个数',n)
##############——函数与循环的区别——##############
在不同的地方,反复执行相同的代码>>>:函数
在相同的地方,反复执行相同的代码>>>:循环
##############################################
def my_len():
n = 0
for i in l1:
n += 1
print('字符串中字符的个数',n)
print(my_len())
这几行代码和真正len的差距
1、真正的len可以统计指定数据的元素个数,我们使用的len现在只有统计指定的数据
2、真正的len执行后有结果,我们的len执行后结果是None
四、函数的语法结构
def + 函数名 +(参数):
''' 函数的注释 '''
函数体代码
return 返回值
1、def:定义函数的关键字
2、函数名:函数名类似于变量名,指函数体代码,命名与变量名一致
3、括号:定义函数的时候,函数名后面肯定要先写括号
4、参数:类似于使用函数的时候,给函数内部传递的数据,可以不写,也可以写好好几个
5、冒号:定义函数也需要有缩进的代码块
6、函数的注释:解释函数的主要功能、使用方法等说明性的文字
7、函数体代码:函数的核心功能
8、return:后面加的东西,执行函数完就会返回
"""
定义i函数需要使用def关键字
定义函数的过程不会执行函数,自会检测它的语法
例如:
def index():
whydeuge 定义的时候不会发生报错
def index1():
if 语法定义时语法错误就会发生报错
"""
这是len的函数结构