1.集合的操作
1.集合的操作
定义:
1.不同元素组成,自动去重
2.无序
3.集合中的元素必须是不可变类型
1.集合的定义:
1 >>> s1 = set('abcd') #同s1 = set{'a','b','c','d'} 2 >>> s1 3 {'a', 'c', 'b', 'd'} 4 >>> t1 = set('cdef') 5 >>> t1 6 {'c', 'f', 'e', 'd'} 7 >>> un_set = set('hello') 8 >>> un_set 9 {'h', 'e', 'o', 'l'} 10 >>> #set是去重的 11 >>> un_set = frozenset(un_set) #定义只读集合 12 >>> un_set 13 frozenset({'h', 'e', 'o', 'l'}) 14 >>> #定义只读集合
2.集合的运算:
集合之间也可进行数学集合运算(例如:并集、交集等),可用相应的操作符或方法来实现。
#子集
>>> s1 = set('abcd') >>> t1 = set('cdef') >>> C = set('ab') >>> C>s1 #判断C是否为S1子集,用符号表示 False >>> C < s1 True >>> C.issubset(s1) #用方法.issubset()表示 True
#交集:所有的相同元素的集合
1 >>> t1 = set('cdef') 2 >>> s1 = set('abcd') 3 >>> i = s1 & t1 4 >>> i 5 {'c', 'd'} 6 >>> s1.intersection(t1) 7 {'c', 'd'}
#并集:集合中所有元素的集合,重复元素只出现一次
1 >>> s1 | t1 #符号表示 2 {'f', 'e', 'a', 'c', 'b', 'd'} 3 >>> s1.union(t1) #方法表示 4 {'f', 'e', 'a', 'c', 'b', 'd'}
#差集:s1和t1的差集,所有属于s1且不属于t1的元素集合
>>> s1 - t1 {'a', 'b'} >>> s1.difference(t1) {'a', 'b'}
#对称差集,s1和t1去掉公共元素后,其余元素的集合
1 >>> s1 ^ t1 2 {'f', 'e', 'a', 'b'} 3 >>> s1.symmetric_difference(t1) 4 {'f', 'e', 'a', 'b'}
3.集合的方法
参考博客,非常详细:https://www.cnblogs.com/suendanny/p/8597596.html
1 #方法 2 >>> s = {1,2,3,4,5} 3 >>> s.add('s') #增加元素 4 >>> s 5 {'s', 1, 2, 3, 4, 5} 6 >>> 7 >>> s.clear() #清空集合 8 >>> s 9 set() 10 >>> 11 >>> s = {1,2,3,4,5} 12 >>> s 13 {1, 2, 3, 4, 5} 14 >>> new_s = s.copy() #浅copy 15 >>> new_s 16 {1, 2, 3, 4, 5} 17 >>> 18 >>> 19 >>> #pop() 20 >>> s.pop() #随机删除,若无,会报错 KeyError 21 1 22 >>> s 23 {2, 3, 4, 5} 24 >>> 25 >>> 26 >>> s.remove(2) #删除指定元素,若指定元素不存在,会报错 KeyError 27 >>> s 28 {3, 4, 5} 29 >>> 30 >>> s.discard("3") #删除集合中的一个元素,如果元素不存在,则不执行任何操作 31 >>> s 32 {3, 4, 5} 33 >>> 34 >>> s.discard(3) 35 >>> s 36 {4, 5} 37 >>> 38 39 >>> # 并集.union() 符号:| 所有元素的集合,重复元素只出现一次 40 >>> # 交集 .intersection() 符号:& 所有相同元素的集合 41 >>> # 子集.issubset() 符号:< 判断是否是子集 42 >>> # 父集.isuperset() 符号:> 判断是否是父集 43 >>> # 差集.difference() 符号:- 所有属于s1且不属于t1的元素构成新的set 44 45 >>> # 对称差集 .symmetric_difference() 符号:^ 46 #对称差集,去掉公共元素后,其余元素的集合 47 48 49 50 >>> s1 51 {'a', 'c', 'b', 'd'} 52 >>> t1 53 {'c', 'f', 'e', 'd'} 54 >>> s1.intersection_update(t1) #用s1与t1的交集,来替换为s1 55 >>> s1 56 {'c', 'd'} 57 58 59 >>> s1 = {1,2} 60 >>> t1 = {2,3,4} 61 >>> s1.update(t1) #update 62 >>> s1 63 {1, 2, 3, 4} 64 >>> 65 >>> s1.update(['h','i'],{4,5,6}) #方法中直接添加元素,可list和set 66 >>> s1 67 {1, 2, 3, 4, 'h', 5, 6, 'i'} 68 >>> 69 70 71 >>> s1 72 {1, 2, 3, 4, 'h', 5, 6, 'i'} 73 >>> t1 74 {2, 3, 4} 75 >>> s = {555,666} 76 >>> 77 >>> s1.isdisjoint(t1) #若s1和t1不存在交集,返回true,否则返回false 78 False 79 >>> s1.isdisjoint(s) 80 True 81 >>> 82 83 >>> s1 = {1,2,3,4} 84 >>> t1 = {2,3,5} 85 >>> s1.difference_update(t1) #用s1与t1的差集更新替换为s1 86 >>> s1 87 {1, 4} 88 89 90 >>> s1 = {1,2,3,4} 91 >>> t1 = {2,3,5} 92 >>> s1.symmetric_difference_update(t1) #用s1与t1的对称差集更新替换为s1 93 >>> s1 94 {1, 4, 5}
1.文件的打开模式
2.文件的读取:注意每次打开文件最后都需要 file.close() 进行关闭,也可直接使用【with】语句打开,其可以自动关闭,具体如下所示:
1 f = open("yesterday.txt",'r',encoding="utf-8") #文件的句柄,”r“是以只读模式打开 2 3 print(f.read) #读取yesterday.txt文件内容 4 print(f.readline) #读取一行,yesterday.txt文件内容 5 print(f.readlines) #将文件输出为一个列表,每一行为列表的一个元素 6 f.close() 7 8 #建议的写法,逐行读写,在第十行打印分割线 9 count = 0 10 for i in f: 11 count +=1 12 if count == 10: 13 print("我是分割线".center(40,'-')) 14 print(i) 15 16 for i in range(5): #行数少的时候打印前五行 17 print(f.readline()) 18 19 20 #逐行读取文件,在第十行的时候输出分割线,占内存较多的写法,不建议 21 for index,i in enumerate(f.readlines()): 22 if index == 9: 23 print("我是分割线".center(40,"-")+" ") 24 print(i)
25
#读取指定路径的文件
file_path = r'C:Users15302PycharmProjectsGKXXXday2yesterday.txt' #注意由于路径中出现 ‘U’在python中此转义符其后为Unicode编码,故此处路径要前要加 【r】
f = open(file_path,'r',encoding='utf-8')
print(f.read())
#with语句
为避免打开文件后忘记关闭,当with代码块执行完毕时,内部会自动关闭并释放文件资源。with使用方法如下:
with open('file or file_path','r',encoding='utf-8') as file_object:
print(f.read())
with open('file or file_path','r',encoding='utf-8') as file_object1 , open('file or file_path','r',encoding='utf-8') as file_object2 #可打开多个
1 with open('111111.txt','rb') as f2: 2 for i in f2: 3 off = -3 4 while True: 5 f2.seek(off,2) 6 data = f2.readlines() 7 if len(data)>1: #当.readlines() len为2时候,证明读了两行 8 print("last hang ",data[-1].decode("utf-8")) #取最后一个值,即最后一行 9 break 10 off *=3 #加大偏移量
2.文件的写入:file.writelines(sequence)的参数是序列,比如列表,它会迭代帮你写入文件。
#w模式,是在文件操作一开始的时候进行判断是否新建和覆盖写入。如果是在文件操作过程中,一直写入也不会覆盖
1 f = open("yesterday.txt",'w',encoding="utf-8") #文件的打开模式为 ‘w’,此时文件可以写入,文件不存在则新建,若存在则清空再写入,切记注意。 2 3 f.write("莺歌燕舞太守醉, ") 4 f.write("明朝酒醒春已归。 ") 5 f.write('枕上诗书闲处好, ') 6 f.write('门前风景雨来佳。') 7 8 f.close()
关于文件光标,默认在0,.read()后在最后
with open('111111.txt','r+') as f2: #txt 文件里为gkxxx,写完后为 2kxxx print(f2.tell()) #0 f2.write('2') print(f2.tell()) #1 f2.read() print(f2.tell()) #5
3.文件的方法:
1 f = open("yesterday.txt",'r',encoding="utf-8") 2 print(f.readline()) #打印第一行 3 print(f.tell()) #打印指针位置 4 print(f.seek(10)) #将指针位置放到第十个字符处,注意虽然可以把指针放到指定处,但是在‘a’,‘r+’模式下,f.write()还是会默认追加到文件末尾,不会在指针处追加 5 print(f.tell()) #打印指针位置
>>>>>>>>结果如下所示: 6 Somehow, it seems the love I knew was always the most destructive kind 7 8 72 9 10 10 10
with open('111111.txt','rb') as f2: #seek补充用法 print(f2.readlines()) print(f2.seek(-2,2)) >>> [b'2kxxx ', b'dfdf'] #二进制中的换行 9 #对于111111.txt中的内容,倒数2个字符,相当于正数9个字符 #seek有三种模式 0,1,2 0:默认用法 1:相对位置seek 2:倒数seek,当用1,2时候,模式要换成rb,
seek用 seek(int,2) 这种模式读取文件最后一行
1 with open('111111.txt','rb') as f2: #读取最后一行的思路 2 for i in f2: 3 off = -3 4 while True: 5 f2.seek(off,2) 6 data = f2.readlines() 7 if len(data)>1: 8 print("last hang ",data[-1].decode("utf-8")) 9 break 10 off *=3
#truncate方法
1 f = open("yesterday.txt",'a',encoding="utf-8") 2 f.truncate(10) #截取文件前十个字符,其余内容删除
>>> somehow,i
#flush方法
1 import time,sys 2 for i in range(10): 3 sys.stdout.write("#") 4 sys.stdout.flush() 5 time.sleep(0.5) #每隔0.5秒打印一个“#”,一共打印十个
4.文件的修改
1 f = open('yesterday.txt','r',encoding='utf-8') 2 f2 = open('yesterday3.txt','w',encoding='utf-8') 3 4 for line in f: 5 if "肆意的快乐" in line: 6 line = line.replace("有那么多肆意的快乐等我享受","有那么多肆意的快乐等Gkx享受") 7 f2.write(line)
>>>>>
将yesterday.txt文件逐行读取,修改其中一行,并write到新文件中
with open('upload_file','r') as f: line = f.readline() while line != '': print(line) line = f.readline()