集合和文件操作
一:集合
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:
(1)去重,把一个列表变成集合,就自动去重了。
(2)关系测试,测试两组数据之前的交集、差集、并集等关系。
二:有关集合的操作
1,增
set1 = {'alex','wusir','ritian','egon','barry'} set1.add('景女神') print(set1) #update:迭代着增加 set1.update('A') print(set1) set1.update('老师') print(set1) set1.update([1,2,3]) print(set1)
2,删
set1 = {'alex','wusir','ritian','egon','barry'} set1.remove('alex') # 删除一个元素 print(set1) set1.pop() # 随机删除一个元素 print(set1) set1.clear() # 清空集合 print(set1) del set1 # 删除集合 print(set1)
3,有关集合的其它操作
3.1 交集。(& 或者 intersection)
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 & set2) # {4, 5} print(set1.intersection(set2)) # {4, 5}
3.2并集。(| 或者 union)
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7} print(set2.union(set1)) # {1, 2, 3, 4, 5, 6, 7}
3.3差集。(- 或者 difference)
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 - set2) # {1, 2, 3} print(set1.difference(set2)) # {1, 2, 3}
3.4反交集。 (^ 或者 symmetric_difference)
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 ^ set2) # {1, 2, 3, 6, 7, 8} print(set1.symmetric_difference(set2)) # {1, 2, 3, 6, 7, 8}
3.5子集与超集
set1 = {1,2,3} set2 = {1,2,3,4,5,6} print(set1 < set2) print(set1.issubset(set2)) # 这两个相同,都是说明set1是set2子集。 print(set2 > set1) print(set2.issuperset(set1)) # 这两个相同,都是说明set2是set1超集。
3.6 frozenset不可变集合,让集合变成不可变类型。
s = frozenset('barry') print(s,type(s)) # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>
三:文件操作
1,文件操作流程
计算机系统分为:计算机硬件,操作系统,应用程序三部分。我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。有了文件的概念,就无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:
#1. 打开文件,得到文件句柄并赋值给一个变量 f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 通过句柄对文件进行操作 data=f.read() #3. 关闭文件 f.close()
ps: 打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为:f.close()
2, 文件编码
f=open()是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
3:文件的打开方式
通过对文件句柄的操作,来得到你想要的东西,例如下:
content = f.read() print(content) f.close #将你这文件句柄,或者是动作关闭,节省内存 f.close()
4,关于读的五种模式
4.1,f.read() ,全部读出来。
4.2,f.readline() 按行读。
f = open('log',encoding='utf-8') line = f.readline() print(line) line1 = f.readline() print(line1) f.close()
4.3,f.readlines() 每一行作为一个元素,放在列表中。
f = open('log',encoding='utf-8') lines = f.readlines() print(lines) f.close()
4.4,循环读取
f = open('log',encoding='utf-8') for i in f: print(i) f.close()
4.5,f.read(n),r 模式:n 是按照字符读取
f = open('log',mode='r',encoding='utf-8') content = f.read(3) #r 模式:n 是按照字符读取 print(content) f.close()
5,w,自写模式,如果没有文件,则创建文件写内容,如果有文件则将原文件内容全部删除,再写。
f = open('log','a',encoding='utf-8') f.write('wusir紧跟其后') f.close()
6,r+ r+b
f = open('log','r+',encoding='utf-8') print(f.read()) f.write('fdsaf') f.close()
7,w+ w+b
f = open('log','w+',encoding='utf-8') f.write('aaaa') f.seek(0) #移动光标 print(f.read()) f.close()
8,a+
f = open('log','a+',encoding='utf-8') f.write('aaaa') f.tell() print(f.tell()) f.seek(2) # print(f.readable()) # print(f.read()) f.close() f = open('log',encoding='utf-8') f.seek(3) #按照字节调整 print(f.read()) f.close() f = open('log','a',encoding='utf-8') f.truncate(3) #截取 截取前面的内容 f.close()
9 ,改动文件
9.1,创建一个新文件
9.2,读取原文件。
9.3,将原文件的内容通过你想要的方式进行更改,并写入新文件。
9.4,将原文件删除。
9.5,将新文件重命名原文件名。
import os with open('log',encoding='utf-8') as f1,\ open('log.bak','w',encoding='utf-8') as f2: for i in f1: i = i.replace('alex','SB') f2.write(i) os.remove('log') os.rename('log.bak','log')