python笔记(6)--深浅拷贝和文件操作
深浅拷贝和文件操作
内容目录:
- 深浅拷贝
- 文件操作
内容回顾&补充
1.内容回顾
- 计算机基础
- 编码
- 语法
- if
- while
- for
- 数据类型
- range / type / id
- 运算符
2.面试题
-
公司线上的系统用的什么?
-
python2和python3的区别?
- 默认解释器编码
- 输入输出
- 整数的除法 / int long
-
运算符
v = 1 or 0 and 8 or 9 print(v)
-
is 和 ==的区别?
-
列举python的数据类型中都有哪些方法?(重要)
今日内容
1.深浅拷贝
只有在嵌套的情况下深浅拷贝才有不同
- 浅拷贝:只copy第一层,嵌套的第二层往上不拷贝
- 深拷贝:拷贝嵌套层次中的所有可变类型
#str + int + bool 因为都是不可变类型,拷贝结果是一样的,内存地址一样
a = "yanan"
b = copy.copy(a)
c = copy.deepcopy(a)
#list + set + dict 找到里面所有可变类型的copy一遍
-
深拷贝
- 只拷贝可变类型,不可变类型的内存地址不拷贝,并指向不可变类型的地址
#深拷贝例子:只拷贝可变类型,不可变类型的内存地址不拷贝,并指向不可变类型的地址 import copy v1 = [1,2,3,{"k1":123,"k2":456}] v2 = copy.deepcopy(v1) print(v1 == v2) #True print(v1 is v2) #False print(v1[0] is v2[0]) #True print(v1[3] == v2[3]) #True print(v1[3] is v2[3]) #False #练习二: v1 = [1,2,3] v2 = copy.deepcopy(v1) print(v1 == v2) #True print(v1 is v2) #False print(v1[0] is v2[0]) #True
-
特殊情况(不重要)
#元组嵌套列表,浅拷贝ID一样,深拷贝ID不一样 import copy v1 = (1,2,3,[1,2,3],4) v2 = copy.copy(v1) print(id(v1),id(v2)) #浅拷贝id值一样 v3 = copy.deepcopy(v1) print(id(v1),id(v3)) #深拷贝id值不一样
2.文件操作
-
打开
f = open("文件路径",mode = "r / w / a",encoding = '文件原来写入时定义的编码')
-
操作
-
r:只读不写
- r+:读写。写入时会根据光标的位置写入,有可能会覆盖其他文字
- file_object.seek(2):2为字节的光标位,覆盖第2字节的字符
#打开文件 file_object = open('log.txt',mode="r",encoding='utf-8')#r,read(只读);a,append(追加) # 读取文件放在内存中(如果文件较大,内存较小,容易爆仓) content = file_object.read() content = file_object.read(3) #读光标位置后的两个字节 concent = file_object.readlines() #按照每一行进行分割到列表中 print(content) # 常用读取文件的方法(以后读取一个特别大的文件) for line in file_object: #读取每行 line = line.strip() #去除换行符 print(line) #关闭文件 file_object.close()
- r+:读写。写入时会根据光标的位置写入,有可能会覆盖其他文字
-
w:只写不读,清空文件重新写入,或创建新文件(文件不存在则新建)
- w+:写读。写入时会将文件清空,读取时按光标位置读取后面内容,默认在光标在最后
- file_object.seek(0):将光标移至开头,进行读取
#打开文件 file_object = open('log.txt',mode="w",encoding='utf-8') #写内容 file_object.write('yanan') file_object.write('周杰伦') #从光标位置往后加,结果为yanan周杰伦 #关闭文件 file_object.close()
- w+:写读。写入时会将文件清空,读取时按光标位置读取后面内容,默认在光标在最后
-
a:只追加不读,文件不存在则新建
- a+:追加读。默认读取光标在最后,永远只追加。
- file_object.seek(0):将光标移至开头,进行读取
#打开文件 file_object = open('log.txt',mode="a",encoding='utf-8') #写内容 file_object.write('yanan')#不管光标位置,永远只追加在最后 #关闭文件 file_object.close()
- a+:追加读。默认读取光标在最后,永远只追加。
-
-
关闭,内存会保存文件
-
每次操作完成后记得关闭
#关闭文件 file_object.close()
-
with...as..关闭文件
- with...as.执行完内部命令后,自动关闭
with open('log.txt', mode="r", encoding="utf-8") as file_object: data = file_object.read() ##with...as执行完语句后自动关闭文件 print(data)
-
-
seek()移动光标位置
-
tell()获取光标当前所在位置,断点续传中会使用到这个
file_object = open('log.txt',mode="rb")#打开文件
file_object.seek(3) #光标移动到第三个字节
data = file_object.tell() #获取光标目前的位置
print(data) #输出为3
关闭文件
file_object.close()
- flush,强制将内存中的数据写入到硬盘上
```python
file_object = open('log.txt', mode="a", encoding="utf-8")
while True:
val = input("请输入:")
file_object.write(val)
file_object.flush() #每次输入都会把内容从内存上写入到硬盘中,文件中才会显示
file_object.close()
3.文件修改
-
不能直接在硬盘上对文件进行修改
-
可以把文件读取到内存中,在内存中修改完成后再写入到硬盘上
with open('log.txt', mode="r", encoding="utf-8") as file_object: data = file_object.read() #将文件的内容读取到内存上 new_data = data.replace("yanan","zhoujielun")#修改文件内容 with open('log.txt', mode="w", encoding="utf-8") as file_object: file_object.write(new_data) #再将文件写入到硬盘中,注意mode为W,直接覆盖原文件
-
比内存大的文件需要修改
f1 = open("log.txt",mode="r",encoding="utf-8") #打开需要修改的原文件 f2 = open("logss.txt",mode="w",encoding="utf-8") #打开一个新文件 for line in f1: #循环每一行 new_line = line.replace("zhu","li") #将每一行修改 f2.write(new_line) #写入到新文件中 f1.close() #关闭文件一 f2.close() #关闭文件二
#优化代码后: with open("log.txt",mode="r",encoding="utf-8") as f1,open("logss.txt",mode="w",encoding="utf-8") as f2: for line in f1: new_line = line.replace("zhu","li") f2.write(new_line)
总结
- 深浅拷贝
- 文件操作
- r
- w
- 文件操作和数据类型的结合使用
- seek是以字节来移动光标位置的