深浅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'\Users\Administrator\Desktop\s8_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\n')) print(f.write('kkkkkk')) f.close() # bbbbbbbaaaaaaaasssss在sssss之后加\n的时候本行不换行,但是在之后会换行 # 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\n', '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']}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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']}
2、将文件'姓名'中的内容
apple 10000 3
map 10 1200
watch 30000 9
computer 5000 6
变成[{'apple':'10000'}]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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'}]
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\n') 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\r\nhujiben' f2=open('姓名','wb') print(f2.write(content)) # 12其中\r\n分别占用一个字节 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的用法相似