深浅拷贝&文件操作

2019-04-11 10:35:29来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

一.深浅拷贝

  浅拷贝:拷贝第一层(顶级对象),或者说:父级对象

  深拷贝:拷贝所有对象,顶级对象及其嵌套对象,或者说父级对象及其子对象

# 应该每次都拷贝一份(但由于小数据池,未拷贝)
v1 = 'alex'
import copy
v2 = copy.copy(v1)
print(id(v1),id(v2))     #同一地址    
练习1
impot copy
v1 = [1,2,3]
v2 = copy.copy(v1)   #浅拷贝
print(v1 == v2)  # True
print(v1 is v2)  # False
print(v1[0] is v2[0])  # True
练习2
 import copy
v1 = [1,2,3,{"name":'武沛齐',"numbers":[7,77,88]},4,5]
v2 = copy.copy(v1)
print(v1 is v2) #False
print(v1[0] is v2[0]) #True
print(v1[3] is v2[3]) #True
print(v1[3]['name'] is v2[3]['name']) #True
print(v1[3]['numbers'] is v2[3]['numbers']) #True
print(v1[3]['numbers'][1] is v2[3]['numbers'][1]) #True

 

练习3
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
练习四
import copy
v1 = [1,2,3,{"name":'武沛齐',"numbers":[7,77,88]},4,5]
v2 = copy.deepcopy(v1)
print(v1 is v2) #False
print(v1[0] is v2[0]) #True
print(v1[3] is v2[3]) #False
print(v1[3]['name'] is v2[3]['name']) #True
print(v1[3]['numbers'] is v2[3]['numbers']) #False
print(v1[3]['numbers'][1] is v2[3]['numbers'][1]) #True

 

二.文件操作

1.  读 / 写 操作

  1. 读取: r (read):只能读不能写,文件不存在就报错

    ?
    #打开文件:
       object = open('某txt文件',mode = 'r',encoding = '编码')
    ?
    #读取文件所有内容到内存:
       content = object.read()
       print(content)
       
    #读取文件的所有内容到内存,并按照每一行进行分割到列表中。
    content = object.readlines()
       print(content)
       
    #如果以后读取一个特别大的文件
    for line in object:  #一行一行进行读取
           line = object.strip()  #去除换行
    print(line)
    ?
    #关闭内容:
       object.close()
    • read(): 全部读到内存

    • read(1)

      • 1表示一个字符

        obj = open('某个txt文件',mode='r',encoding='utf-8')
        data = obj.read(1) # 1个字符
        obj.close()
        print(data)
      • 1表示一个字节(二进制中)

        obj = open('某个txt文件',mode='rb')    # b:二进制的意思
        data = obj.read(3) # 1个字节
        obj.close()
  2. 写入:w (write): 只能写不能读(先清空文件),文件不存在就新建

    #打开文件:
       object = open('某个txt文件或要新建的文件',mode = 'w',encoding = '编码')
    ?
    #写内容:
       object.write('xxx')
    ?
    #关闭文件:
       object.close()
    • write(字符串)

      obj = open('某个txt文件或要新建的文件',mode='w',encoding='utf-8')
      obj.write('你好')
      obj.close()
    • write(二进制)

      obj = open('某个txt文件或要新建的文件',mode='wb')
      ?
      # obj.write('你好'.encode('utf-8'))
      v = '你好'.encode('utf-8')
      obj.write(v)
      ?
      obj.close()
  3. 追加; a (append): 只能追加不能读,不存在则新建

    #打开文件:
       object = open ('某个txt文件或要新建的文件',mode = 'a',encoding = '编码')
    ?
    #写内容:
       object.append()
    ?
    #关闭文件
       object.close()

2. 其他操作:seek / tell / flush

  1. seek(光标字节位置),无论模式是否带b,都是按照字节进行处理。

    obj = open('某个txt文件',mode='r',encoding='utf-8')
    obj.seek(3) # 跳转到指定字节位置,读取后面内容
    data = obj.read()
    obj.close()
    print(data)
    ?
    obj = open('a.txt',mode='rb')
    obj.seek(3) # 跳转到指定字节位置
    data = obj.read()
    obj.close()
    print(data)
  2. tell(), 获取光标当前所在的字节位置

    obj = open('a.txt',mode='rb')
    obj.read()
    data = obj.tell()
    print(data)
    obj.close()
  3. flush,强制将内存中的数据写入到硬盘

    v = open('a.txt',mode='a',encoding='utf-8')
    while True:
       val = input('请输入:')
       v.write(val)
       v.flush()
    v.close()

3 . 关闭文件

  1.  

    v = open('a.txt',mode='a',encoding='utf-8')
    ?
    v.close()
  2.  

    with open('a.txt',mode='a',encoding='utf-8') as v:
       data = v.read()
    # 缩进中的代码执行完毕后,自动关闭文件

4 .文件内容的修改

  1.  

    with open('a.txt',mode='r',encoding='utf-8') as f1:
       data = f1.read()
    new_data = data.replace('飞洒','666')
    ?
    with open('a.txt',mode='w',encoding='utf-8') as f1:
       data = f1.write(new_data)
  2. 大文件修改

    f1 = open('a.txt',mode='r',encoding='utf-8')
    f2 = open('b.txt',mode='w',encoding='utf-8')  #先打开两个文件,再进行操作
    for line in f1:      # 一行一行进行修改
       new_line = line.replace('要被修改的内容','被修改后的内容')
       f2.write(new_line)
    f1.close()
    f2.close()
    ?
    #另一种写法:
    with open('a.txt',mode='r',encoding='utf-8') as f1, open('c.txt',mode='w',encoding='utf-8') as f2:
       for line in f1:
           new_line = line.replace('要被修改的内容','被修改后的内容')
           f2.write(new_line)
     

三.练习:

  1.请将user中的元素根据 _ 链接,并写入 'a1.txt' 的文件

    user = ['alex','eric']
    data = '_'.join(user)
    object = open('a1.txt',mode = 'w',encoding = 'utf-8')
    object.write(data)
    object.close()

  2.请将user中的元素根据 | 链接,并写入 'a2.txt' 的文件

    user = [
    {'name':'alex','pwd':'123'},   
    {'name':'eric','pwd':'olbody'},]
    object = open('a2.txt',mode = 'w',encoding = 'utf-8')
    for item in user:
        line = '%s|%s\n' %(item['name'],item['pwd'])
        object.write(line)
     object.close()

 

  3.请将a2.(根据2)txt中的文件读取出来并添加到一个列表中 ['alex|123','eric|olbody']

方法一:
    list = []
    objecct = open('a2.txt',mode = 'r',encoding = 'utf-8')
    for line in object:
       line = line.strip()
       list.append(line)
     print(list)
    
 方法二:
      file_obj = open('a2.txt',mode='r',encoding='utf-8')
    content = file_obj.read()
    file_obj.close()
    content = content.strip() #去除最后一个换行
    data_list = content.split('\n') #根据中间的换行进行切割
    print(data_list)

 


原文链接:https://www.cnblogs.com/wenxin1120/p/10666189.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:机器学习——XGBoost大杀器,XGBoost模型原理,XGBoost参数含义

下一篇:循环&运算符