首页 > 编程语言 > 详细

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

时间:2019-10-08 20:38:35      阅读:84      评论:0      收藏:0      [点我收藏+]

深浅拷贝和文件操作

今日内容:

  • 深浅拷贝
  • 文件操作

内容回顾&补充

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,强制将内存中的数据写入到硬盘上

    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是以字节来移动光标位置的

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

原文:https://www.cnblogs.com/lynlearnde/p/11637286.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!