首页 > 代码库 > python-数据类型补充及文件处理操作
python-数据类型补充及文件处理操作
___数据类型____
一、列表的复制
浅复制和深复制
浅复制只复制一层,深复制完全克隆,慎用
1、实现浅复制的三种方式:
name=[‘song‘,‘xiao‘,‘nan‘] import copy name1=copy.copy(name)#相当于列表中中 name1=name.copy() name2=name[:] name3=list(name)
浅复制的适用场合
person=[‘name‘,[‘saving‘,100]] p1=person[:] p2=person[:] p1[0]=‘songxiaonan‘ p2[0]=‘ying‘ print(p1) print(p2) p1[1][1]=1000 print(p1) print(p2)#因为是浅复制,所以在更改p1【1】【1】的时候,p2【1】【1】也会跟着更改
2、深复制
name5=copy.deepcopy(name)
二、元组
元组是不可变的,已经设定不可再更改,只能进行查询操作,别名“制度列表”、
元组只有两种内置操作:index和count
name=(‘song‘,‘xiao‘) print(name.count(‘song‘)) print(name.index(‘xiao‘))
适用场合:写的程序希望存储的数据不能被更改,比如程序中数据库的连接信息,一旦被更改就会影响连接数据库,可以用元组来存储该信息
三、字典
字典是无序的,是通过key来查找信息,不需要下标
定义字典:info={
‘stu1101‘:‘song‘,
‘stu1102‘:‘xiao‘,
‘stu1103‘:‘nan‘,
}
‘stu1101‘,‘stu1102‘,‘stu1103‘代表key,冒号后面的是相应值
字典的增删改查
#查询 2种方式 info[stu1101]#这种方式,如果指定的key不存在就会报错 info.get(‘stu1101‘)#如果key不存在,返回None,建议使用这种查询方法 #修改 info[stu1101]=‘lallalallalal‘#如果key不存在,就会想字典中插入该key以及该key的值 #删除 2种方法 del info[‘stu1101‘] info.pop(‘stu1101‘) #判断某key是否存在 ‘stu1101’ in info 返回值true false
字典其他用法
#打印字典所有的key(第一层key) print(info.keys()) #打印字典所有值 print(info.vaules()) #将字典转换为列表 info.items() #合并两个字典update catalog2={ "stu1101":‘song111‘, 1:3, 2:4 } catalog2.update(info)#重复key更新,不重复的key,合并 print(catalog2) #setdfualt:如果字典中存在指定的key,这种使用原数据,如果不存在key,则插入一条新数据 info.setdefualt(‘台湾‘,{‘wwww.taiwan.com‘:[1,2]) #fromkeys:初始化一个新的字典 print(info.fromkeys([6,7,8]))#注意:3个key共享一个内存地址
字典的循环
print(info) for i in info: print(i)# 以为字典是通过key来查询的,所以i代表的是key,打印出来的结果也只是key for i in info: print(i,info[i])#只打印值 for a,b in info.items(): print(a,b)#相比两种方法,上面的方法比价高效
____文件处理____
小知识点:
shell的sed命令:逐行处理文件内容,并将结果输出到屏幕
sed的替换命令:
sed ‘s/abc/def/g’ file | 把行内的所有abc替换成def,如果没有g,则只替换行内的第一个abc |
sed -n ‘s/abc/def/p’ file | 只打印发生替换的那些行 |
sed ‘s/abc/&def/’ file | 在所有的abc后面添加def(&表示匹配的内容) |
sed -n ‘s/abc/def/gp’ file | 把所有的abc替换成def,并打印发生替换的那些行 |
sed ‘s#abc#def#g’ file | 把所有的abc替换成def,跟在替换s后面的字符就是查找串和 替换串之间的分割字符,本例中试# |
1、打开文件 (默认字符集为utf8)
1 f=open(‘file‘,‘r‘,encoding=‘utf-8‘) 2 #with 语句打开文件 3 with open(‘file‘,‘r‘,encoding=‘utf-8‘) as f,4 open(‘file2‘,‘w‘,encoding=‘utf-8‘) as f2: 5 ............. 6 7 #with 语句打开文件后,等with模块执行完毕,自动关闭文件,减少资源占用
2、读取文件
f.read()#读取全部文件 f.readline()#逐行读取文件 f.readines()#读取全部文件,读取出来的文件为一个列表,每行是一个元素 #注意1:文件还能读取一遍,执行一次read()后,光标置在文件最后一行,不能回到首行,再次执行read()的时候,只能从文件最后位置往下读,所有第二次read(),返回结果为空 #注意2:read()读取方式是,将文件全部从硬盘写到内存后,再输出,如果文件比较大,则需要等一段时间才能看到但会的及结果,有一种边写边读的方法的:for line in f。。。。 for line in f: print(line) #这种方法读取文件的时候,读取一行删除一行,即内存中只存一行数据,适合大文件读取
3、设置光标位置
f.tell() #打印目前光标所在位置 按字符计数 f.seek()#设置光标的返回位置 参数为0,将光标返回到文件开始位置 f.encoding#返回文件的字符编码 f.fileno()#返回文件句柄在内存中编号 f.readable()#判断文件是否可读 f.flush()#刷新文件
f.truncate()#截断文件,只有在文件在写属性的时候才可以使用,不加参数,默认清空文件
4、写
b=open(‘file‘,‘w‘) #w模式 创建一个新文件 # a模式 追加 b.write(‘sldksjfisdjisjoifd\n‘) #____________进度条________________ impory sys,time for i in range(20): sys.stdout.write(‘#‘) sys.stdout.flush() time.sleep(0.5)
5、修改文件
#读写属性 r+ 读并追加 file=open(‘file‘,‘r+‘,encoding=‘utf-8‘) file.readline() file.write(‘-----------------------------‘) file.seek(0) print(file.read()) #写读 w+ 先创建一个新文件 无卵用 #追加读 a+ #rb属性:以二进制模式读取文件 适用场合1 网络传输 2 打开视频文件 r=open(‘erjinzhiFile.py‘,‘rb‘) #wb属性:写二进制文件 wb=open(‘erjinzhi‘,‘wb‘) wb.write(‘songxiaonan song‘.encode()) #写一个文件到一个新文件:一行一行的读取文件,边读边写,如果不是要修改的行,直接将该行写入到新文件,如果是要修改的行,修改完该行,再将该行写入到新文件中 #需要两个文件:源文件和新文件 #将文件中的‘12345678’换成‘000000000’ with open(‘file‘,‘f‘,encoding=‘utf-8‘) as f, open(‘filenew‘,‘w‘,encoding=‘utf-8’) as fnew: for line in f: if ‘12345678’ in line: line=line.replace(‘12345678‘,‘000000000‘) fnew.write(line l
____集合____
作用:去重和关系测试
将列表转为集合后,就会自动去重
集合也是无序的
1、去重
name=[1,1,2,3,4,5,6,7,8,9,9,9,9,9,9]
name=set(name)
2、关系测试
name1=[1,2,3,4,4,5,5,6,6,7,100] name1=set(name1) name2=set([2,3,4,9]) #交集 name1.intersection(name2) #并集 name.union(name2) #差集 name1有的 name2没有的 name1.difference(name2) #判断是否是子集 name1.issubset(name2) #判断是否是父集 name1.issuprset(name2) #对称差集 交集取反 print(name1.symmetric_difference(name2)) #判断 是否没有交集 没有交集返回true 有交集返回False print(name1.isdisjoint(name2))
运算符进行集合的关系测试
print(name1&name2)#交集 print(name1|name2)#并集 print(name1-name2)#差集 print(name1^name2)#对称差集
3集合的方法
#增加 #集合中无插入,只有添加 name1.add(9999) #删除 name1.remove(‘song‘)#如果没有指定的字符串,报错 name1.discard(‘song‘)#如果没有指定的字符串,不报错 print(len(name1))#集合长度 1 in name1#1 是否咋 name1中
____字符编码和转码____
1、万国编码unicode,兼容gbk,utf-8等等,存一个英文和中文字符都占用2个字节16位,可以显示各个国家的语言
2、ASCII码,默认值占用一个字节8位,不能存储中文
3、为了解决浪费空间的问题,出现了另一个字符编码utf-8,是可变字符长,所有英文字符依然按照ASCII的总是存储,占用1个字节,中文字符占用3个字节
py3默认所有字符编码的unicode
要在py2使用中中文字符集,首先
#-*- coding:utf-8 -*-
name
name=‘绿萝植物‘ name_to_unicode=name.decode(‘utf-8‘).encode(‘gbk‘)#decode 解码 encode编码
无论是在py2合适在py3,字符编码之间的转换都要先解码成unicode,再编码
python-数据类型补充及文件处理操作