集合:
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:
去重,把一个列表变成集合,就自动去重了。
关系测试,测试两组数据之前的交集、差集、并集等关系。
1,集合的创建。
set1 = set({1,2,‘barry‘}) set2 = {1,2,‘barry‘} print(set1,set2) # {1, 2, ‘barry‘} {1, 2, ‘barry‘}
2,集合的增。
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) 复制代码
3,集合的删。
set1 = {‘alex‘,‘wusir‘,‘ritian‘,‘egon‘,‘barry‘} set1.remove(‘alex‘) # 删除一个元素 print(set1) set1.pop() # 随机删除一个元素 print(set1) set1.clear() # 清空集合 print(set1) del set1 # 删除集合 print(set1)
4,集合的其他操作:
4.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}
4.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}
4.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}
4.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}
4.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超集
5,frozenset不可变集合,让集合变成不可变类型。
s = frozenset(‘barry‘) print(s,type(s)) # frozenset({‘a‘, ‘y‘, ‘b‘, ‘r‘}) <class ‘frozenset‘>
文件操作:
一文件介绍:
计算机系统分为:计算机硬件,操作系统,应用程序三部分。
我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:
1,文件路径 2,编码方式:gbk,utf-8 3,打开方式:只读,只写,读写,.... ps: 错误分析:1 unicodedecodeerror:文件存储和打开的编码不一致. UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x80 in position 18: illegal multibyte sequence 转译:路径前面+ r 或者是 双\ SyntaxError: (unicode error) ‘unicodees
二 在python中
#1. 打开文件,得到文件句柄并赋值给一个变量 f=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) #默认打开模式就为r #2. 通过句柄对文件进行操作 data=f.read() #3. 关闭文件 f.close()
三 f=open(‘a.txt‘,‘r‘)的过程分析
#1、由应用程序向操作系统发起系统调用open(...) #2、操作系统打开该文件,并返回一个文件句柄给应用程序 #3、应用程序将文件句柄赋值给变量f
四 强调
#强调第一点: 打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为: 1、f.close() #回收操作系统级打开的文件 2、del f #回收应用程序级的变量 其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源, 而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close() 虽然我这么说,但是很多同学还是会很不要脸地忘记f.close(),对于这些不长脑子的同学,我们推荐傻瓜式操作方式:使用with关键字来帮我们管理上下文 with open(‘a.txt‘,‘w‘) as f: pass with open(‘a.txt‘,‘r‘) as read_f,open(‘b.txt‘,‘w‘) as write_f: data=read_f.read() write_f.write(data)
#强调第二点: f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。 这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。 f=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘)
五 python2中的file与open
#首先在python3中操作文件只有一种选择,那就是open() #而在python2中则有两种方式:file()与open() 两者都能够打开文件,对文件进行操作,也具有相似的用法和参数,但是,这两种文件打开方式有本质的区别,file为文件类,用file()来打开文件,相当于这是在构造文件类,而用open()打开文件,是用python的内建函数来操作,我们一般使用open()打开文件进行操作,而用file当做一个类型,比如type(f) is file
文件读写方法
# f = open(‘C:\\Users\\Administrator\\Desktop\\new.txt‘,encoding=‘utf-8‘,mode=‘r‘) # #open 他是windows系统的命令 # #r:只读 # # f 变量:f f_obj,obj,file_hl file_hanlder 文件句柄 # #通过对文件句柄的操作,来得到你想要的东西. # content = f.read() # print(content) # #f.close 将你这文件句柄,或者是动作关闭,节省内存 # f.close() #读 #C:\\Users\\Administrator\\Desktop\\new.txt 绝对路径 #相对路径:同一个文件夹下的文件就是相对路径 # r #rb一般用在非文字类型的文件:图片,视频 #文件的下载和上传的功能用b模式 # f = open(‘log‘,‘r‘,encoding=‘utf-8‘) # content = f.read() # print(content,type(content)) # f.close() #r 五种模式: #1 f.read() 全部读出来 #5,f.read(n) # f = open(‘log‘,mode=‘r‘,encoding=‘utf-8‘) # content = f.read(3) # r 模式:n 是按照字符读取 # print(content) # f.close() # f = open(‘log‘,mode=‘rb‘) # content = f.read(5) # rb 模式:n 是按照字节读取 # print(content) # f.close() # # bytes ---> str # s = b‘\xe4\xb8\xb0\xe5\x8e‘.decode(‘utf-8‘) # print(s) #2 f.readline() 按行读 # f = open(‘log‘,encoding=‘utf-8‘) # line = f.readline() # print(line) # line1 = f.readline() # print(line1) # f.close() # 3 f.readlines() 每一行作为一个元素,放在列表中 # f = open(‘log‘,encoding=‘utf-8‘) # lines = f.readlines() # print(lines) # f.close() #4 推荐方式 循环读取 # f = open(‘log‘,encoding=‘utf-8‘) # for i in f: # print(i) # f.close() # w 如果没有文件,则创建文件写内容, # 如果有文件则将原文件内容全部删除,在写. # f = open(‘log‘,‘w‘,encoding=‘utf-8‘) # f.write(‘Alex是sb‘) # f.close() # f = open(‘log1‘,‘w‘,encoding=‘utf-8‘) # f.write(‘Alex依然是sb‘) # f.close() # f = open(‘log1‘,‘wb‘) # f.write(‘Alex依然是sb‘.encode(‘utf-8‘)) # f.close() #追加 a ab # f = open(‘log‘,‘a‘,encoding=‘utf-8‘) # f.write(‘wusir紧跟其后‘) # f.close() # r+ r+b # f = open(‘log‘,‘r+‘,encoding=‘utf-8‘) # print(f.read()) # f.write(‘fdsaf‘) # f.close() #w+ w+b # f = open(‘log‘,‘w+‘,encoding=‘utf-8‘) # f.write(‘aaaa‘) # f.seek(0) #移动光标 # print(f.read()) # f.close() #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() #常用方法: read() readline() seek() ‘‘‘ def close(self, *args, **kwargs): # real signature unknown 关闭文件 pass def fileno(self, *args, **kwargs): # real signature unknown 文件描述符 pass def flush(self, *args, **kwargs): # real signature unknown 刷新文件内部缓冲区 pass def isatty(self, *args, **kwargs): # real signature unknown 判断文件是否是同意tty设备 pass def read(self, *args, **kwargs): # real signature unknown 读取指定字节数据 pass def readable(self, *args, **kwargs): # real signature unknown 是否可读 pass def readline(self, *args, **kwargs): # real signature unknown 仅读取一行数据 pass def seek(self, *args, **kwargs): # real signature unknown 指定文件中指针位置 pass def seekable(self, *args, **kwargs): # real signature unknown 指针是否可操作 pass def tell(self, *args, **kwargs): # real signature unknown 获取指针位置 pass def truncate(self, *args, **kwargs): # real signature unknown 截断数据,仅保留指定之前数据 pass def writable(self, *args, **kwargs): # real signature unknown 是否可写 pass def write(self, *args, **kwargs): # real signature unknown 写内容 pass ‘‘‘ # # with open(‘log‘,‘r‘,encoding=‘utf-8‘) as f1,\ # open(‘log1‘,‘r‘,encoding=‘utf-8‘) as f2: # print(f1.read()) # print(f2.read()) #改动文件: #1,创建一个新文件. #2,读取原文件. # import os # with open(‘log‘,encoding=‘utf-8‘) as f1,\ # open(‘log.bak‘,‘w‘,encoding=‘utf-8‘) as f2: # # 3,将原文件的内容通过你想要的方式进行更改,并写入新文件件. # old_content = f1.read() # new_content = old_content.replace(‘alex‘,‘SB‘) # f2.write(new_content) # #4,将原文件删除. # os.remove(‘log‘) # #5,将新文件重命名原文件名. # os.rename(‘log.bak‘,‘log‘) import os with open(‘log‘,encoding=‘utf-8‘) as f1, open(‘log.bak‘,‘w‘,encoding=‘utf-8‘) as f2: # 3,将原文件的内容通过你想要的方式进行更改,并写入新文件件. for i in f1: i = i.replace(‘alex‘,‘SB‘) f2.write(i) #4,将原文件删除. os.remove(‘log‘) #5,将新文件重命名原文件名. os.rename(‘log.bak‘,‘log‘)