文件内的光标移动
# 1.前情提要
with open(r'a.txt','r',encoding='utf8') as f:
print(f.read(3))
# read在文本模式下 括号内的数字表示的是读取指定的字符个数
with open(r'a.txt', 'rb') as f:
print(f.read(9).decode('utf8'))
# read在二进制模式下 括号内的数字表示的是读取指定的字节数
# 2.具体控制
seek方法可以控制光标的移动 在文本模式下移动的单位也是字节数
seek(offset,whence)
offset:控制移动的字节数
whence:控制模式
0:相对于文件开头(让光标先移动到文件开头)
支持文本模式和二进制模式
1:相对于当前位置(让光标先停留在当前位置)
只支持二进制模式
2:相对于文件结尾(让光标先移动到文件末尾)
只支持二进制模式
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'))
文件的修改
with open(r'b.txt', 'r+t', encoding='utf-8') as f:
f.seek(9) # 不写模式 默认是0模式 基于文件开头 并且兼容文本和二进制
f.write('<嘀嘀嘀>')
"""
文件数据在硬盘上其实是刻死 不可能从中间再添加新的内容
只能将老内容移除 刻新的
"""
实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
# 优点: 在文件修改过程中同一份数据只有一份
# 缺点: 会过多地占用内存
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('张三','李四'))
实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,
删掉原文件,将临时文件重命名原文件名(狸猫换太子)
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
import os # 模块(后面会学)
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'))
os.remove('b.txt') # 删除文件
os.rename('.b.txt.swap', 'b.txt') # 重命名文件
函数
# 什么是函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
定义规则
1.函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
2.任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
3.函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
4.函数内容以冒号起始,并且缩进。
5.return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
python具体代码结构
def 函数名(参数1,参数2):
'''函数的注释'''
函数体代码
return 返回值
1.def
是定义函数的关键字
2.函数名
函数名类似于是变量名 指代函数体代码 命名与变量名一致
3.括号
定义函数的时候 函数名后面肯定要先写括号
4.参数
类似于使用函数的时候 给函数内部传递的数据 可以不写 或者单个、多个
5.冒号
定义函数也需要有缩进的代码块
6.函数的注释
用于解释函数的主要功能、使用方法等说明性文字
7.函数体代码
函数的核心功能 也是我们将来编写的核心
8.return
后面跟什么 那么执行完函数之后就会返回什么