python笔记(6)--深浅拷贝和文件操作

深浅拷贝和文件操作

内容目录:

  • 深浅拷贝
  • 文件操作

内容回顾&补充

1.内容回顾

  • 计算机基础
  • 编码
  • 语法
    • if
    • while
    • for
  • 数据类型
  • range / type / id
  • 运算符

2.面试题

  1. 公司线上的系统用的什么?

  2. python2和python3的区别?

    • 默认解释器编码
    • 输入输出
    • 整数的除法 / int long
  3. 运算符

    v = 1 or 0 and 8 or 9
    print(v)
    
  4. is 和 ==的区别?

  5. 列举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()
      
    • 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()
      
    • a:只追加不读,文件不存在则新建

      • a+:追加读。默认读取光标在最后,永远只追加。
        • file_object.seek(0):将光标移至开头,进行读取
      #打开文件
      file_object = open('log.txt',mode="a",encoding='utf-8')
      
      #写内容
      file_object.write('yanan')#不管光标位置,永远只追加在最后
      
      #关闭文件
      file_object.close()
      
  • 关闭,内存会保存文件

    • 每次操作完成后记得关闭

      #关闭文件
      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是以字节来移动光标位置的
原文地址:https://www.cnblogs.com/lynlearnde/p/11637286.html