文件操作和函数
一、文件操作
1.其他模式补充
r、w、a称为纯净模式
rb、wb、ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
r+:可读,可写
w+:可读,可写
a+:可读,可写
在rt模式下,read内的数字表示字符的个数
除此之外,数字表示的都是字节(一个中文字符3个bytes,一个英文字符1Bytes)
2.文件内光标的移动
read(3):
(1)文件打开方式为文本模式时,代表读取3个字符
(2)文件打开方式为b模式时,代表读取3个字节
f.seek(offset,whence)
offset:相对偏移量,光标移动的位数
whence:
0:参照文件的开头,t和b都可以使用
1:参照光标所在的当前位置,只能在b模式下用
2:参照文件的末尾,只能在b模式下使用
truncate是截断文件,文件打开方式必须可写,但不能用w或w+等方式打开(直接清空文件),所以truncate要在r+或a或a+等模式下测试效果
with open(r'test','a',encoding='utf-8') as f: f.truncate(6) # 接收的字节的长度 整型 # 保留0~6字节数 后面的全部删除(截断)
检测文件内容:
with open(r'test01.txt','rb') as f: # 先将光标移动到文件末尾 f.seek(0,2) while True: res = f.readline() # 查看光标移动了多少位 bytes print(f.tell()) if res: print("新增的文件内容:%s"%res.decode('utf-8')) # 说明有人操作当前文件 else: # 说明文件没有被任何人操作 print('暂无其他人操作该文件')
ps:写日志
import time res = time.strftime('%Y-%m-%d %X') print(res,type(res)) # 记录当前时间 with open(r'test01.txt','a',encoding='utf-8') as f: f.write('%s egon给jason发了1个亿的工资\n'%res)
3.文件的修改
方式一:
先将数据由硬盘读到内存(读文件),在文件中完成修改(字符串的替换),再覆盖原来的内容(写文件)
优点:任意时间硬盘上只有一个文件,不会占用过多硬盘空间
缺点:当文件过大的情况下,可能会造成内存溢出
with open(r'test02.txt','r',encoding='utf-8') as f: data = f.read() # 全部读入内存,如果文件很大,会很卡 print(data) print(type(data)) with open(r'test02.txt','w',encoding='utf-8') as f: res = data.replace('egon','jason') # 在内存中完成修改 print(data) f.write(res) # 一次性写入新文件
方式二:
创建一个新文件,循环读取老文件内容到内存进行修改,将改好的内容写到新文件中,将老文件删除,将新文件的名字改成老文件名
优点:内存中始终只有一行内容,不占内存
缺点:在某一时刻硬盘上会同时存在两个文件
import os with open(r'test02.txt','r',encoding='utf-8') as read_f,\ open(r'test02.swap','a',encoding='utf-8') as write_f: for line in read_f: new_line = line.replace('jason','egon') write_f.write(new_line) os.remove('test02.txt') os.rename('test02.swap','test02.txt')
二、函数
计算长度:
s = 'hello' print(len(s))
s = 'hello'
# 将for循环的代码放到某一个地方,谁要用谁就拿 def my_len(): n = 0 for i in s: n += 1 print(n) my_len()
函数体代码定义阶段只检测语法,不执行代码
可以通过变量名找到变量对应的值
可以通过函数名+括号,找到函数体所对应的代码并执行
注:函数名的命名规则跟变量名一模一样
函数就是工具,并且函数萹蓄先定义后调用(函数名+括号)

浙公网安备 33010602011771号