欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

文件处理二

程序员文章站 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卡的国家