day03.15
文件内光标的移动(了解)
with open(r'a.txt', 'rb') as f: print(f.read(3).decode('utf8')) f.seek(3, 1) # 基于当前位置 继续往后移动三个字节 f.seek(-3, 2) # 基于文件末尾 往前移动三个字节 print(f.tell()) # 获取光标基于文件开头的字节数 print(f.read().decode('utf8'))
note:seek方法可以控制光标的移动其在文本模式下移动的单位也是字节数
小结:
seek(offset,whence)
offset:控制移动的字节数
whence:控制模式
0:相对于文件开头(让光标先移动到文件开头)
支持文本模式和二进制模式
1:相对于当前位置(让光标先停留在当前位置)
只支持二进制模式
2:相对于文件结尾(让光标先移动到文件末尾)
只支持二进制模式
文件内容的修改
储存在硬盘上的数据有两个状态:
即占有态与自由态;我们删除数据的过程其实就是将数据原来的位置标记成自由态;之后如果有新的数据进来了并且落到了自由态位置那么直接覆盖,如果没有新的数据储存,那么原有的数据是有办法可以恢复的,即从自由态变为占有态。
note:
文件数据在硬盘上其实是刻死,不可能从中间再添加新的内容,只能将原本的内容移除,然后添加新的内容。
1、实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件。
优点: 在文件修改过程中同一份数据只有一份
缺点: 会过多地占用内存
with open('b.txt', mode='r', encoding='utf-8') as f: data = f.read() with open('b.txt', mode='w', encoding='utf-8') as f: f.write(data.replace('张一蛋', 'jason'))
2、实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件,然后删除原文件,将临时文件重命名为原文件。
优点:不会占用过多的内存
缺点:在文件修改过程中同一份数据存了两份
with open('b.txt', 'r', encoding='utf-8') as read_f, \ open('.b.txt.swap', 'w', encoding='utf-8') as wrife_f: for line in read_f: wrife_f.write(line.replace('jason', 'jerry'))
python当中的函数
函数的定义
函数的定义就相当于事先将函数体代码保存起来,然后将内存地址赋值给函数名,函数名就是对这段代码的引用,这和变量的定义是相似的。
在定义了函数之后,就可以使用该函数了,但是在Python中要注意一个问题,就是在Python中不允许前向引用,即在函数定义之前,不允许调用该函数。没有事先定义函数而直接调用,会直接报错。
函数的分类
内置函数:
python解释器提前给我们写好的函数(工具);比如:len()、split()、strip()等等。
这种类型的函数我们只需要直接拿来使用即可,因此这种类型的函数我们称之为内置函数。
自定义函数:
顾名思义,自定义函数就是我们根据自己需要的功能来编写的函数就是自定义函数。
函数的语法结构
函数的语法结构是由函数的关键字def、函数的名称、括号、参数、冒号、函数的注释、函数体代码和函数的返回值return构成。
具体结构:
def 函数名(参数1,参数2): '''函数的注释''' 函数体代码 return 返回值
note:
- def: 定义函数的关键字;
- 函数名:函数名指向函数内存地址,是对函数体代码的引用。函数的命名应该和变量的命名相似,做到见名知意,函数名能够反映出函数的功能。
- 括号:定义一个函数的时候,函数名称后面必须加括号;括号内定义参数,参数是可有可无的,且无需指定参数的类型。
- 参数:函数的参数就类似于使用函数的时候给函数内部传输的数据;
函数参数params可以是零个、一个或者多个,同样的,函数参数也不用指定参数类型,因为在Python中变量都是弱类型的,Python会自动根据值来维护其类型。
- 冒号:括号后要加冒号,然后在下一行开始缩进编写函数体的代码。
- 函数的注释:用于解释函数的主要功能、使用方法等说明性文字。描述函数功能,参数介绍等信息的文档,非必要,但是建议加上,从而增强函数的可读性。
- 函数体:由语句和表达式组成,是函数的核心功能。 函数体为pass代表什么都不做,称之为空函数;就相当于用pass来充当函数体的占位符。
- return 值:定义函数的返回值,表示函数调用执行到此结束,return是可有可无的。如果没有return语句,会自动返回NONE,如果有return语句,但是return后面没有接表达式或者值的话也是返回NONE。
小结:
总的来说,函数的调用就相当于使用工具的过程,但是这个工具需要提前去准备,等到需要的时候直接取用。提前定义好的函数就相当于一个工具,可以反复使用的工具。
定义函数的时候一定要使用关键字def;定义函数的过程中并不会执行函数体代码,只会检测代码的语法功能;调用函数的时候记得要加小括号。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?