文件处理二
程序员文章站
2022-05-22 20:44:17
文件处理二 一、深浅copy补充 结论 二、文本打开模式 三、其他玩法 四、小应用 写入文本 获取文件实时动态 五、修改文件内容 ......
文件处理二
一、深浅copy补充
#浅copy 1、不改变任何值 l1 = [1, 2, [3, 4]] print(l1) print(id(l1)) print(id(l1[0])) print(id(l1[1])) l2 = l1.copy() print(l2) print(id(l2)) print(id(l2[0])) print(id(l2[1])) >>>[1, 2, [3, 4]] 3024156513352 140729249591552 140729249591584 [1, 2, [3, 4]] 3024306504712 140729249591552 140729249591584 2、改变小列表中的值 l1 = [1, 2, [3, 4]] print(l1) print(id(l1)) print(id(l1[0])) print(id(l1[1])) l2 = l1.copy() print(l2) print(id(l2)) l2[2][0] = 5 print(l2) print(id(l2[0])) print(id(l2[1])) >>>[1, 2, [3, 4]] 2432008016968 140729249591552 140729249591584 [1, 2, [3, 4]] 2432158204936 [1, 2, [5, 4]] 140729249591552 140729249591584 结论: 浅copy除了拷贝后l1和l2的id不一样,不管改变任何值,其他的id都一样,因为本质是用了两个框架其实是共用一个值。 #深copy import copy l1 = [1, 2, [3, 4]] print(l1) print(id(l1)) print(id(l1[0])) print(id(l1[2][0])) l2 = copy.deepcopy(l1) l2[0] = 66 print(l2) print(id(l2)) print(id(l2[0])) l2[2][0] = 5 print(id(l2[2][0])) >>>[1, 2, [3, 4]] 1848709174344 140729247166720 140729247166784 [66, 2, [3, 4]] 1848860346184 140729247168800 140729247166848 结论: 深copyl1和l2id不一样,改变copy后l2的值,只会改变自己本身的id,而不会改变l1的id
- 结论
浅copy除了拷贝后l1和l2的id不一样,不管改变任何值,其他的id都一样,因为本质是用了两个框架其实是共用一个值。 深copyl1和l2id不一样,改变copy后l2的值,只会改变自己本身的id,而不会改变l1的id
二、文本打开模式
# 'r'的用法:只读,若没有改文件会报错 f = open(r'1.txt',mode="r",encoding="utf-8")#r的作用是防止转义 print(f.read())#read的类型是读完之后光标就跑到末尾,所以第二次打印以后会看不到内容 # print(f.read()) f.close() >>>亚峰666 燃烧吧 月薪30k 月薪30k 月薪30k #'rb'的用法 f = open(r'a.txt',mode='rb')#此时不需要encoding=,因为已经是二进制模式 print(f.read()) f.close() >>>b'\xe6\x9c\x88\xe8\x96\xaa30k\xe5\x8a\xa0\xe6\xb2\xb9\xe5\x8a\xa0\xe6\xb2\xb9' #'w'的用法:只写,若没有就新建一个文件,若改文件存在会先删除原文件中的内容,然后重新写入 f = open(r'2.txt',mode='w',encoding='utf-8') f.write("亚峰加油啊,你是最棒的") f.close() >>>亚峰加油啊,你是最棒的 #'wb'的用法 f = open(r'3.txt',mode='wb')#bytes类型 f.write("亚峰666".encode('utf-8'))#此时是字符串类型,需用变成“wb”类型,即用.encode f.close() >>>亚峰666 #'a'的用法 f = open(r'3.txt',mode='a',encoding='utf-8') f.write("\n燃烧吧") f.close() >>>亚峰666 燃烧吧 #'r+w'的用法,#先读后写 f = open(r'3.txt',mode='r+',encoding='utf-8') print(f.read()) f.write("\n月薪30k") f.close() >>>亚峰666 燃烧吧 月薪30k #'r+b'也是读写(以byte类型) f = open(r'3.txt',mode='r+b') print(f.read()) f.write("月薪30k".encode('utf-8'))#先写后读光标会从第一个开始,也就是会替换你原先的内容,若光标过长,就替换全部 f.close() >>>b'\xe4\xba\x9a\xe5\xb3\xb0666\r\n\xe7\x87\x83\xe7\x83\xa7\xe5\x90\xa7\xe6\x9c\x88\xe8\x96\xaa30k' #'w+'的用法 f = open('a.txt',mode='w+',encoding='utf-8') f.write("月薪30k")#先写后读光标会从第一个开始,也就是会替换你原先的内容,若光标过长,就替换全部 print(f.read()) f.close() >>>亚峰666 燃烧吧月薪30k月薪30k #'a+'的用法 f = open('1.txt',mode='a+',encoding='utf-8') f.write("\n月薪30k") f.seek(0)#光标从0 开始 print(f.read()) f.close() >>>亚峰666 燃烧吧 月薪30k 月薪30k 月薪30k 月薪30k
三、其他玩法
#read f = open('a.txt',mode='r+',encoding='utf-8') content = f.read(3)#读出来的都是字符,可指定读取个数 print(content) f.close() >>>月薪3 #seek f = open('a.txt',mode='r+',encoding='utf-8') f.seek(3)#是按照字节去定光标,注意一个中文三个字符 content = f.read() print(content) f.close() >>>薪30k加油加油加油 #tell f = open('a.txt',mode='a+',encoding='utf-8') f.write('加油') # print(f.tell())#告诉你光标的位置 count = f.tell() f.seek(count-9)#向前移动9个字符 print(f.read(2))#只读2个字符 f.close() >>>油加 with open(r"a.txt", mode='w')as f: #注意 f.write('[]')不可以列表 f.writelines(['1','l']) # for + f.write#改模式则可以,但列表中的内容必须为字符串,不可为其他类 型
四、小应用
- 写入文本
import time res = time.strftime('%y-%m-%d %h:%m:%s')#时间库获取年月日,时 with open(r'01.txt','a',encoding='utf-8')as f: for i in range(10): f.write(f'{res}:马上要学函数了,有点难,怎么办\n')
- 获取文件实时动态
import time with open(r"a.txt", 'r', encoding='utf-8')as f: # f.seek(0, 2) # 以文件末尾为参照点,移动0位 while true: # time.sleep() res = f.readline() # 一次读一行 if res: # 如果你读出数据了,就执行下面的代码块 print(f'录入记录:{res}')
五、修改文件内容
# 第一方案 with open(r'02.txt','r',encoding='utf-8')as f: data = f.read() print(data) print(type(data)) with open(r'02.txt','w',encoding='utf-8')as f: res = data.replace('副书记','亚峰牛批') f.write(res) with open(r'02.txt','r',encoding='utf-8')as rf,\ open(r'02.txt','a',encoding='utf-8')as wf: data = rf.read() res = data.replace('副书记', '亚峰牛批') wf.seek(0,0) wf.write(res) >>>几哈亚峰牛批公积金卡的国家几哈亚峰牛批公积金卡的国家 <class 'str'> #第二种方案 import os with open(r'02.txt','r',encoding='utf-8')as rf,\ open(r'03_wap.txt','w',encoding='utf-8')as wf: data = rf.read() res = data.replace('公积金', '亚峰666') wf.write(res) os.remove('02.txt') os.rename('03_wap.txt','b.txt') >>>几哈亚峰牛批亚峰666卡的国家几哈亚峰牛批亚峰666卡的国家几哈亚峰牛批亚峰666卡的国家几哈亚峰牛批亚峰666卡的国家