一.文件读写其他模式补充
r w a (可以看做纯净模式)
r+ w+ a+
先创建一个test文本文档,并输入内容:套你aabb猴子啊我
wiht open(r'test',mode='r+',encoding=‘utf-8’) as f:
print(f.readable())
print(f.writable())
print(f.readline())
f.write('套你猴子')
with open(r'test',mode='w+',encoding='utf-8') as f:
print(f.readable())
print(f.writable())
print(f.readline())
f.write('套你猴子') # 先清除文件内容,再写入
with open(r'test',mode='r+b') as f:
print(f.readable())
print(f.writable())
res = f.read()
priint(res.decode('utf-8')) # 一
res1 = str(res,encoding='utf-8') # 二
print(res1)
二.文件内光标移动
在rt模式下,read内的数字,表示的是字符的个数,除此之外,数字表示的都是字节。
with open(r'test','r',encoding='utf-8') as f:
print(f.read(5))
with open(r'test','rb') as f:
res = f.read(10) # 读得是三个字节bytes
print(res)
print(res.decode('utf-8'))
文件内光标的移动:
f.seek(offset,whence)
offset:相对偏移量,光标移动的位数
whence:
0:参照文件的开头 t和b都可以使用
1:参照光标所在的当前位置 只能在b模式下用
2:参照文件的末尾 只能在b模式下使用
with open(r'test','rt',encoding='utf-8') as f:
print(f.read(1))
f.seek(6,0) seek移动的都是字节数
f.seek(4,0) seek移动的都是字节数
f.seek(0,0)
print(f,read(1))
f.seek(6,0)
print(f.read())
with open(r'test','rb') as f:
print(f.read(3),decode('utf-8'))
f.seek(0,0)
print(f.read(3),decode(utf-8))
f.seek(7,0)
print(f.read(1).decode('utf-8'))
with open(r'test','rb') as f:
print(f.read(3).decode('utf-8'))
f.seek(3,1)
print(f.read(1))
with open(r'test','rb') as f:
print(f.read())
f.seek(-4,2)
print(f.read().decode('utf-8'))
with open(r'test',''r+,encoding='utf-8') as f:
f.seek(3,0)
f.write('帅') # 替换
写日志:
import time
res = time.strfttime('%Y-%m-%d %X')
print(res,type(res)
with open(r'test.txt','a',encoding='utf-8') as f:
f.write('%s T给Z发了个大红包\n'%res)
检测文件内容:
with open(r'test.txt','rb') as f:
# 先将光标移动到文件末尾
f.seek(0,2)
while True:
res = f.readline()
#查看光标移动了多少位 bytes
# print(f.tell())
if res:
print("新增的文件内容:%s"%res.decode('itf-8'))
# 说明有人操作当前文件
#else:
# 说明文件没有被任何人操作
print('暂无其他人操作该文件')
截断文件:
wirh open(r'test','a',encoding='utf-8') as f:
f.truncate(6) # 接收的字节的长度 整型
# 保留0~6字节数,后面的全部删除(截断)
修改文件(******)
with open(r'test','r+',encoding='utf-8') as f:
f.seek(6,0)
f.write('比')
修改文件方式一:
1.先将数据由硬盘读到内存(读文件)
2.在内存中完成修改(字符串的替换)
3.再覆盖原来的内容(写文件)
with open(r'test.txt','r',encoding='utf-8') as f:
data = f.read()
print(data)
print(type(data))
with open(r'test.txt','w',encoding='utf-8') as f:
res = data.replace('T','Z')
print(data)
f.write(res)
"""
优点:任意时间硬盘上只有一个文件,不会占用过多的硬盘空间
缺点:当文件过大的情况下,可能会造成内存溢出
"""
文件修改方式二:
1.创建一个新文件
2.循环读取老文件内容到内存进行修改,将修改好的内容写到新文件中
3.将老文件删除,将新文件的名字改成老文件名
import os
with open(r'test.txt','r',encoding='utf-8') as read_f,\
open(r'test.swap','a',encoding='utf-8') as write_f:
for line in read_f:
new_line = line.replace('Z'.'T')
write_f.write(new_line)
os.remove('test.txt')
os.rename('test.swap','test.txt')
"""
优点:内存中始终只有一行内容,不占内存
缺点:在某一时刻硬盘上会同时存在两个文件
"""
三.函数前奏
s = ‘hello’
# print(len(s))
# 假设没有len了
# 函数体代码定义截断只检测语法 不执行代码
deft test():
abcd
efghij
klmnopq
rstuvwxyz
print(test())
"""
可以通过变量名找到变量对应的值
可以通过函数名+括号,找到函数体所对应的代码并执行
"""
函数名的命名规则跟变量名一样
函数就是工具,并且函数必须先定义后调用(函数名+括号)
# def my_len():
# n = 0
# for i in s:
# n += 1
# print(n)
# my_len()
# my_len()
# my_len()
# l = [1,2,3,4,5]
# m = 0
# for j in l:
# m += 1
# print(m)
# 将for循环的代码放到某一个地方 谁要用谁就拿