zoukankan      html  css  js  c++  java
  • Four-深浅copy和文件操作

    深浅copy

     1、浅copy

      l1 = [1, 2, 3, ['barry', 'alex']]
      l2 = l1.copy()
      print(l1,id(l1))  #[1, 2, 3, ['barry', 'alex']] 2628597576008
      print(l2,id(l2))  #[1, 2, 3, ['barry', 'alex']] 2628597576136
      l1[1] = 222
      print(l1,id(l1))  #[1, 222, 3, ['barry', 'alex']] 2628597576008
      print(l2,id(l2))  #[1, 2, 3, ['barry', 'alex']] 2628597576136
    
      l1[3][0] = 'wusir'
      print(l1,id(11))  #[1, 222, 3, ['wusir', 'alex']] 1981768224
      print(l2,id(l2))  #[1, 2, 3, ['wusir', 'alex']] 2628597576136

       对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性

      2、深deepcopy

      import copy
      l1 = [1, 2, 3,['barry', 'alex']]
      l2 = copy.deepcopy(l1)
      print(l1,id(11))    # [1, 2, 3, ['barry', 'alex']] 1981768224
      print(l2,id(l2))    #[1, 2, 3, ['barry', 'alex']] 1874792784136
    
      l1[1] = 222
      print(l1,id(l1))    #[1, 222, 3, ['barry', 'alex']] 1874792680392
      print(l2,id(l2))    #[1, 2, 3, ['barry', 'alex']] 1874792784136
    
      l1[3][0] =  'wusir'
      print(l1,id(l1))    #[1, 222, 3, ['wusir', 'alex']] 1874792680392
      print(l2,id(l2))    #[1, 2, 3, ['barry', 'alex']] 1874792784136

      对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变

    文件操作

      文件操作流程:

      1、打开文件,得到文件句柄并复制给一个变量

      2、通过句柄对文件进行操作

      3、关闭文件

    #1、打开文件,得到文件句柄并赋值给一个变量
    f=open('姓名','r',encoding='utf-8')
    #2、通过句柄对文件进行操作
    data=f.read()
    #3、关闭文件
    f.close()

      

    #1、由应用程序向操作系统发起系统调用open(....)
    #2、操作系统打开该文件,并返回一个函数句柄给应用程序
    #3、应用程序将文件句柄赋值给变量f

      关闭文件的注意事项

      打开一个文件包含两部分资源:操作系统及打开的文件+应用程序的变量。在操作完毕一个文件时,必须把该文件的这两部分资源一个不落的回收,回收方法是

    1、f.close()  # 回收操作系统级打开的文件,必须写
    2、del f  # 回收应用程序级的变量,可写可不写

      其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源,而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们在

      操作完毕文件之后,一定要记住f.close()。

      with:由于很多时候会忘记在最后写上f.close(),可以使用with,在运行完with里面的内容之后会自动关闭文件

    with open('原文件',encoding='utf-8')as f:
        content=f.read()
        print(content)
    # 我承受了这个年纪不该有的机智
    # 我承受了这个年纪不该有的机智
    # 我承受了这个年纪不该有的机智
    # 我承受了这个年纪不该有的机智
    # 我承受了这个年纪不该有的机智
    # 我承受了这个年纪不该有的机智

      文件的编码:

      f=open(.....)是由操作系统打开文件,那如果没有为open指定编码,那么打开文件的默认编码很明显就是由操作系统说的算,此时操作系统会用自己默认的编码去打开文件,

      在windows中是gbk编码,在linux和mac系统中是utf-8编码。

      文件的打开方式

    文件句柄=open('文件路径','模式')

      找到文件详解:文件与py的执行文件在相同的路径下,直接用文件的名字既可以打开文件

             文件与py的执行文件不在相同的路径下,就要使用绝对路径来寻找文件

      文件的路径,需要用取消转义的方式来表示:1、\       2、r’件的绝对路径'

      如果以写文件的方式打开一个文件,那么不存在的文件就会被创建,存在的文件之前的内容就会被清空

    f=open(r'UsersAdministratorDesktops8_tmp.txt','w',encoding='utf-8') 
                                 # 文件路径、操作模式、编码
    f.write('哈哈哈')
    f.close()  

      文件的读写

    f=open('姓名','w')  # f:文件操作符 文件句柄 文件操作对象
    #习惯叫f file f_obj f_handler fh
    #print(f.writable())  # 判断文件是否可写
    #print(f.readable())  # 判断文件是否可读
    f.write('15768628')  # 写文件的时候需要写数字,需要把数字转换 成字符串
    

      

    f=open('姓名','w',encoding='utf-8')
    print(f.write('hdkjhskdj'))
    print(f.write('jh73987hjdhs'))  # hdkjhskdjjh73987hjdhs
    f.close()
    

      

    f=open('姓名','w',encoding='utf-8')
    print(f.write('bbbbbbb'))
    print(f.write('aaaaaaaa'))
    print(f.write('sssss
    '))
    print(f.write('kkkkkk'))
    f.close()
    # bbbbbbbaaaaaaaasssss在sssss之后加
    的时候本行不换行,但是在之后会换行
    # kkkkkk

      打开文件

    f=open('文件名','r',encoding='utf-8')
    
    在打开文件时,默认模式为读。

      1、读文件的第一种方式:read方法,用read方法会一次性的读出文件中的所有内容

    f=open('姓名','r',encoding='utf-8')
    content=f.read()
    print(content)
    # bbbbbbbaaaaaaaasssss
    # kkkkkk

      2、读一部分内容:read(n),指定读n个单位

    f=open('姓名','r',encoding='utf-8')
    content=f.read(4)
    print(content)
    # bbbb
    

      

    f=open('姓名','r',encoding='utf-8')
    print(f.read(18))
    #bbbaaaaaaaasssss
    #k

      3、读文件的第三种方式:按照行读,每次执行readline就会往下读一行

    f=open('姓名','r',encoding='utf-8')
    content=f.readline()
    print(content.strip())  # strip去掉空格、制表符、换行
    #bbbbbbbaaaaaaaasssss
    content1=f.readline()
    print(content1.strip())
    #kkkkkk

      4、读文件的第四种方式:readlines,返回一个列表,将文件中的每一行作为列表中的每一项,返回一个列表

    f=open('姓名','r',encoding='utf-8')
    content=f.readlines()
    print(content) 
    #['bbbbbbbaaaaaaaasssss
    ', 'kkkkkk']

      5、读:最常用的方法

    f=open('姓名','r',encoding='utf-8')
    for line in f:
        print(line.strip())
    # bbbbbbbaaaaaaaasssss
    # kkkkkk

       1、将文件'姓名'中的内容

      apple 10000 3
      map 10 1200
      watch 30000 9
      computer 5000 6

        变成{'apple':['10000','3']}

    f=open('姓名',encoding='utf-8')
    goods={}
    goods_list=[]
    for line in f:
        line=line.strip()
        goods_list=line.split()
        goods[goods_list[0]]=goods_list[1:]
    print(goods)
    f.close()
    #{'apple': ['10000', '3'], 'map': ['10', '1200'], 'watch': ['30000', '9'], 'computer': ['5000', '6']}
    View Code

       2、将文件'姓名'中的内容

      apple 10000 3
      map 10 1200
      watch 30000 9
      computer 5000 6

        变成[{'apple':'10000'}]

    f=open('姓名',encoding='utf-8')
    goods_list=[]
    for line in f:
        goods_dic={}
        line=line.strip()
        goods_lts=line.split()
        print(goods_lts)
        goods_dic['name']=goods_lts[0]
        goods_dic['price']=goods_lts[1]
        goods_list.append(goods_dic)
    print(goods_list)
    f.close()
    # ['apple', '10000', '3']
    # ['map', '10', '1200']
    # ['watch', '30000', '9']
    # ['computer', '5000', '6']
    # [{'name': 'apple', 'price': '10000'}, {'name': 'map', 'price': '10'}, {'name': 'watch', 'price': '30000'}, {'name': 'computer', 'price': '5000'}]
    View Code

      3、将文件'姓名'中的内容

      apple 10000 3
      map 10 1200
      watch 30000 9
      computer 5000 6

        去掉空格、制表符、换行符之后打印出来

    f=open('姓名',encoding='utf-8')
    for line in f:
        if line.strip():
            print(line.strip())
    f.close()
    # apple 10000 3
    # map 10 1200
    # watch 30000 9
    # computer 5000 6

     

    #1. 打开文件的模式有(默认为文本模式):
    r:只读模式【默认模式,文件必须存在,不存在则抛出异常】
    w:只写模式【不可读;不存在则创建;存在则清空内容】
    a:之追加写模式【不可读;不存在则创建;存在则只追加内容】
    
    #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,
    使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式) rb wb ab 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

      在python文件操作中没有改。

      w+:可写可读:一上来文件就清空了。

      尽管可读:1、但是读出来的内容是你这次打开文件新写入的

           2、光标在最后,需要主动移动光标才可读

    f=open('姓名','w+',encoding='utf-8')
    f.write('abc
    ')
    f.write('hujiben')
    f.seek(0)  # 将光标移到起始位置
    print(f.read())
    
    # abc
    # hujiben

      一般情况下:文件操作,要么读,要么写,很少会用到读写、写读同时用的。

      常用的:

      r、w、a

      rb、wb、ab 不需要指定编码

    f=open('姓名','rb')
    content=f.read()
    f.close()
    print(content)
    #b'abc
    hujiben'
    f2=open('姓名','wb')
    print(f2.write(content))  # 12其中
    分别占用一个字节
    f2.close()

      文件内的光标移动:

      1、seek  光标移动到指定位置

        f.seek(0)   移动到最开始

        f.seek(0,2)   移动到最末尾

      2、tell  告诉我光标在第几个字节

    f=open('姓名','r',encoding='utf-8')
    content=f.readine()
    print(content.strip())
    #tell告诉你当前光标所在的位置
    print(f.tell())
    f.seek(4)  # 光标移动到三个字节的地方
    content=f.read(1)  # 读一个字符

      3、truncate(n)  从文件开始的位置只保留指定字节的内容

      f.truncate(3)  

      文件的修改

    #打开原文件
    f=open('原文件',encoding='utf-8')
    #创建一个新的文件
    f1=open('原文件.bak','w',encoding='utf-8')
    # 读出原文件里的内容
    old_content=f.read()
    #操作读出来的字符串,把字符串中的内容替换掉
    new_content=old_content.replace('我承受了','上天给了我')
    #将替换之后的内容写到新文件里
    f1.write(new_content)
    f.close()
    f1.close()
    #删除原文件,将新文件重命名成原文件的名字
    import os  # os模块
    os.remove('原文件')  # 删除文件
    os.rename('原文件.bak','原文件')  # 重命名,于replace的用法相似
    只修改一行的内容,其他的不改变
    f=open('原文件',encoding='utf-8')
    f1=open('原文件.bak','w',encoding='utf-8')
    count=0
    for i in f:
        if '我承受了' in i and count==0:
            new_content=i.replace('我承受了','上天给了我')
            f1.write(new_content)
            count=1
        else:f1.write(i)
    f.close()
    f1.close()
    #删除原文件,将新文件重命名成原文件的名字
    import os  # os模块
    os.remove('原文件')  # 删除文件
    os.rename('原文件.bak','原文件')  # 重命名,于replace的用法相似
    

      

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    ddd
  • 原文地址:https://www.cnblogs.com/gumo/p/7744876.html
Copyright © 2011-2022 走看看