python-python基础3
本节内容
- 集合
- 文件操作
集合
集合是一个无序的,不存在重复元素的数据集合。(可以用来列表去重,比如可以先把列表转成集合,再转回列表)。
定义:
set1 = {1,2,3,4,5} # 集合是无序的
常用操作:
list_1 = [1,5,7,3,5,6,9] list_1 = set(list_1) print(list_1,type(list_1)) # 去重 list_2 = set([2,3,0,6,22,8]) print(list_1.intersection(list_2)) # 取交集 预期输出结果是{3, 6} print(list_1.union(list_2)) # 并集 预期输出结果:{0, 1, 2, 3, 5, 6, 7, 8, 9, 22} print(list_1.difference(list_2)) #差集:1有2没有。 预期输出结果:{1, 5, 9, 7} print(list_1.issubset(list_2)) #子集 返回布尔值 print(list_1.issuperset(list_2)) # #对称差集 print(list_1.symmetric_difference(list_2)) # 把相同的元素去掉 list_3 = set([1,3,7]) list_4 = set([5,6,7,8]) #判断是否有交集 print(list_3.isdisjoint(list_4)) # 没有交集返回True #添加成员 list_3.add(999) #删除成员 list_3.remove(3) # 方法一。不存在,会报错 list_3.discard(3) # 方法二。不存在,不报错
文件操作
文件操作流程:
1.打开文件,拿到文件句柄
2.通过句柄对文件操作
3.关闭文件
打开文件的集中模式:
r: 只读模式
w: 只写模式。文件不存在则创建;存在则清空文件内容
a: 追加模式。可读,不存在则创建,存在也不会清空内容(废话,清空了还追加个毛线)。
r+: 可读、可写、可追加
w+: 可读、可写。文件不存在则创建;存在则清空文件内容
rb: 以二进制方式打开文件用来只读
rb+: 以二进制方式打开文件用来读写
wb:以二进制方式打开写文件。文件不存在则创建;存在则清空文件内容
wb+:以二进制方式打开文件用来读写。文件不存在则创建;存在则清空文件内容
练习需要用到的被操作文件《释放自我》:
This is a file for test, which you will used for learning file operation. 工作里怪事真多 奇葩围绕着我 今天必须吐槽一曲释放自我 只想应付考核 不想踏实干活 出现问题只会互相甩锅 1个续班10个入口 用户不知道往哪走 哪里交钱才能报名成功 家长报名五科目 有五个助教跟着 信息收集五遍家长要炸了 什么独立人格 什么特么诚信负责 只会为老板的朋友圈高歌 领导随口一说 立刻讨好跟着 项目马上启动不计后果 找个学校试点 旅游城市优先 度假都不用再自己花钱 细数这么多年 不来总部这边 难道是嫌北京学校太远 干活的累死累活 有成果那又如何 到头来干不过写PPT的 要问他业绩如何 他从来都不直说 掏出那PPT一顿胡扯 小程序做了几个 就连APP也没放过 做完就完了也不关心结果 您混完资历走了 只剩下脏乱差了 转场同业机构职位升了 什么节操品格 什么叫做职业道德 只会为人民币疯狂的高歌 烂摊子从没管过 吹牛X从没停过(消音) 之前的PPT继续白话 一线工作从没去过 客服电话从没听过 借员工用户的名义去胡说 重复的都抢着做 创新的没有几个 美其名曰“延续性”实怕担责 一个简单问题需要答案 董事长问总裁,而总裁问校长 校长问总监,总监问经理 经理问主管 主管问专员 专员还要问兼职 什么全球视野 什么特么志高行远 说好的三年规划每年都要变 业绩好功劳在你 业绩差不能怪你 或许是职能部门不够给力 白天黑夜工作 如此拼命奔波 要做出成绩才对得起自我 前方迷途太多 坚持就有突破 正确做事就会越来越广阔 教育非常严肃 千万不能糊弄 对学员负责是一切的基础 虽然前路漫长 心中还有力量 别忘了绝望中的那种希望 问题不会灭亡 只能自己变强 牛逼的人在哪里都不彷徨 新年有新气象 热血依旧滚烫 要相信是金子早晚会发光
基本操作:
fp = open("释放自我",encoding='utf-8') # encoding的作用是指定编码,因为windows下默认不是utf-8 data = fp.read() print(data) fp.close()
再来个例子:
fp = open("释放自我",encoding='utf-8') data = fp.read() data2 = fp.read() print(data) print('data2: ',data2) fp.close()
这段代码和第一段代码的区别是连续读了两次,但是data2获取的内容是空。第一次读完以后,指针到了文件最后,第二次再读的时候指针就到了文件的最后,这时候读就是空。
写操作
fp = open("释放自我",encoding='utf-8',mode='r+') # mode不能是仅w模式,否则会出现清空文件的情况。open()函数默认是只读打开 data = fp.read() print(data) fp.write('\n明天会更好') fp.close()
追加写
fp = open("释放自我2",encoding='utf-8',mode='a') # a是追加写 fp.write('\n明天会更好') fp.close()
高效的读取文件
先来举一个最low的读取文件的例子:
fp = open("释放自我",encoding='utf-8',mode='r') for index,line in enumerate(fp.readlines()): #读取文件,第10行不打印。readline()是读取一行 if index == 9: print('=====================') continue print(line.strip()) fp.close()
这段代码的含义很清楚,关键看读取文件的方式。这段代码里读取文件采用for循环整个文件,逐行读取,这种方式会把整个文件都会逐行加入到内存,导致内存占用过高。所以这种方式不推荐,属于最low的方式。下面展示常规、高效的读取文件的方式:
fp = open("释放自我",encoding='utf-8',mode='r') for line in fp: # 这种方法可以保证内存里始终只有一行文件的内容,因为此时fp是一个迭代器 print(line) fp.close()
调整文件中光标位置
1 fp = open("释放自我",encoding='utf-8',mode='r') 2 fp.readline() #读取一行 3 print(fp.tell()) # 获取当前指针位置(上面读取完一行以后的位置) 4 fp.seek(8) #把光标移动到8位置。这种定位是按照字节进行的。如果文件里是汉字,会报错,提示无法定位。 5 print(fp.readline()) #会打印8位置以后的一行的内容
查看文件编码
fp.encoding
查看文件句柄
fp.fileno()
查看文件是不是终端设备
fp.isatty()
同步写入磁盘(flush)
>>> f = open('test.txt',"w") >>> f.write('hello1\n') #cmd里执行这些命令,通过notepad++打开文件查看效果 7 >>> f.flush() >>> f.write('hello2\n') 7 >>> f.flush()
扩充一点: 实现打印进度条的功能:
import sys,time # 引入time模块是为了延时,方便查看效果 for i in range(50): time.sleep(0.5) sys.stdout.flush() #使用flush函数是为了把新打印的#号显示到屏幕上,如果没有这个flush,看不到没0.5秒就显示一个#号的效果 sys.stdout.write('#') #打印#到屏幕
其他操作:
truncate() #清空一个文件
关于写文件
读写方式打开文件:
fp = open("释放自我",encoding='utf-8',mode='r+') print(fp.readline()) fp.write('====================jason=======================#') print(fp.readline()) fp.close()
这段代码的目的是为了解释清楚,文件的读写只能是追加写,不能在中间写。上面的write语句的执行结果是把写的内容写到文件最后(初学者会认为读完一行以后写,会写到第二行,其实不是这样的。)
写读方式打开文件:
fp = open("释放自我2",encoding='utf-8',mode='w+') print(fp.readline()) fp.write('====================jason=======================#') print(fp.readline()) fp.close()
写读方式打开文件和读写方式打开文件的异同点:
不同点是:
写读方式打开文件如果文件不存在则创建,如果文件存在,则会清空文件;读写方式打开文件,如果文件不存在会报错。
相同点:都可以读写;都只能追加写。
关于修改文件
需要注意的是:文件是不可修改的,只能通过写一个新文件达到修改文件的目的。示例:
fp = open("释放自我2",encoding='utf-8',mode='r') fp_new = open('释放自我2.bak','w',encoding='utf-8') for line in fp: if "应付" in line: line = line.replace('应付','得到好评',1) # 找到”应付“二字并替换 fp_new.write(line) fp.close() fp_new.close()
with语句
with语句存在的意义:防止出现打开文件并操作完成后忘记关闭文件。使用with语句的情况下,不必显示调用close方法关闭文件:
1 with open('释放自我2',encoding='utf-8','r+') as fp, \ 2 open('sjdk',encoding='utf-8', 'w') as fp2: 3 for line in fp: 4 print(line)
这段代码展示打开两个文件,并逐行读取其中的一个文件,操作完成后不需要显示关闭文件,with语句会自动处理。

浙公网安备 33010602011771号