本章内容
- 文件内光标的移动
- 文件数据修改
- 函数简介
- 函数的语法结构
文件内光标的移动
# 1. 文件内容的读取,光标移动 eg:
with open(r'1.txt','r',encoding='utf8') as f:
print(f.read(3))
print(f.read(3))
# 在文本模式下,括号内的数字表示的是读取指定的字符个数
"""
如下图所示:
绿色的箭头表示第一个print输出后光标所在的位置
红色的箭头表示第二个print输出后光标所在的位置
"""
# 在二进制模式下,read括号内的数字表示的是读取指定的字节数
eg:
with open(r'1.txt', 'rb') as f:
print(f.read(9).decode('utf8'))
print(f.read(3).decode('utf8'))
# unicode 中所有的字符都是用2bytes来起步表示
# utf8中,中文用3bytes来表示 英文用1bytes来表示
# 2. 控制光标的移动
with open(r'1.txt', 'r',encoding='utf8') as f:
print(f.read(2))
f.seek(3, 0)
print(f.read(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'))
"""记得文本文件用b模式的时候要注意文本内容的末尾是否有空格和空行,不然可能查找不到"""
# 正确示例:
# 错误示例:
"""
seek方法可以控制光标的移动 在文本模式下移动的单位也是字节数
模板: seek(offset,whence)
offset (控制偏移的字节数)
whence (控制模式(0, 1, 2))
0: 相对于文件开头(让光标先移动到文件开头)
支持文本模式和二进制模式
1:相对于当前位置(让光标先停留在当前位置)
只支持二进制模式
2:相对于文件结尾(让光标先移动到文件末尾)
只支持二进制模式
"""
实际应用
# 实时检测文件内是否有新增的内容并打印出来
with open('access.log', mode='rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
# 没有内容
pass
else:
print(line.decode('utf-8'), end='')
文件数据修改
"""
文件数据在硬盘上其实是刻死 不可能从中间再添加新的内容
只能将老内容移除 刻新的
"""
文件修改方式一:
# 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
# 优点: 在文件修改过程中同一份数据只有一份
# 缺点: 会过多地占用内存
eg:
with open('a.txt', mode='rt', encoding='utf-8') as f:
data = f.read()
with open('a.txt', mode='wt', encoding='utf-8') as f:
f.write(data.replace('张一蛋', 'SB'))
文件修改方式二:
# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
函数简介
函数的使用必须遵循’先定义,后调用’的原则。函数的定义就相当于事先将函数体代码保存起来,然后将内存地址赋值给函数名,函数名就是对这段代码的引用,这和变量的定义是相似的。
没有事先定义函数而直接调用,就相当于在引用一个不存在的’变量名’。
函数的语法结构
def 函数名(参数1,参数二...):
'''文档描述'''
函数体代码
return 返回值
# 1. def: 定义函数的关键字;
# 2. 函数名:函数名指向函数内存地址,是对函数体代码的引用。函数的命名应该反映出函数的功能;
# 3. 括号:括号内定义参数,参数是可有可无的,且无需指定参数的类型;
# 4. 冒号:括号后要加冒号,然后在下一行开始缩进编写函数体的代码;
# 5. """文档描述""": 描述函数功能,参数介绍等信息的文档,非必要,但是建议加上,从而增强函数的可读性;
# 6. 函数体:由语句和表达式组成;
# 7. return 值:定义函数的返回值,return是可有可无的。
注意事项
"""
定义函数需要使用def关键字
定义函数的过程不会执行函数体代码 只会检测语法
def s(x, y):
if 语法错误定义的时候就会报错
def s():
abcdef哈哈哈 定义的时候不会报错
调用函数需要使用函数名加括号
"""