一、文件操作
现有以下文件test:
文件基本操作:
1 f = open(r'test',encoding='utf-8') #打开一个文件,默认为只读模式(r可以不写) 2 # print(f.read()) #获取文件里面的所有内容 3 # print('readline:',f.readline()) #读取文件第一行的内容,返回字符串对象 4 # print('readlines',f.readlines()) #获取文件里面所有的数据,每一行的数据放到一个list里面 5 6 f.close() #关闭文件
1、打开文件的模式
# r,只读模式(默认)。【只能读,不能写;文件不存在会报错】 # w,只写模式。【不可读;不存在则创建;存在则覆盖以前文件的内容】 # a,追加模式。【不可读; 不存在则创建;存在则只追加内容】 # r +,【指针在最前面。可读、可写;可追加,如果打开的文件不存在的话,会报错】 # w +,【写读模式,使用w + 的话,已经存在的文件内容会被清空,可以读到已经写的文件内容】 # a +,【指针在最后面。追加读写模式,不存在则创建;存在则只追加内容;】
#追加模式下,读和写的时候焦点始终在文件的末尾,除非使用函数seek()强制调整
#只要沾上r,文件不存在肯定会报错 #只要沾上w,文件内容肯定会被清空 # rb 以二进制读模式打开,"b"表示处理二进制文件 # wb 以二进制写模式打开 # ab 以二进制追加模式打开
2、读取文件的三个方法:read()、readline()、readlines()
read()方法:
1)读取整个文件的内容,将所有内容放到一个字符串变量中
2)若文件大于可用内存,不可能使用这种处理
readline()方法:
1)readline()每次读取一行
2)readline()返回的是一个字符串对象,保存当前行的内容
readlines()方法:
1)读取所有文件内容,返回一个list,元素是每行的数据,包括换行符
2)大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
3、写操作
常用的写入函数为write(str),writelines(list[str])
1)写入的必须是字符串,writelines()写入字符串列表
2)写入的内容不会自动添加换行符,必须显示写入换行符
#写 # f = open(r'test', 'w',encoding='utf-8') # f.write("test") #追加 names = ["xx","dd","hh"] f = open(r'test', 'w',encoding='utf-8') f.writelines(names) #传一个list,然后把list里面的每一个元素写入到文件中
4、文件其他操作方法
f = open('test', 'r+', encoding='utf-8') # encoding参数可以指定文件的编码 f.tell()#获取当前文件的指针指向 f.seek(0)#把当前文件指针指向哪 f.fulsh()#写入文件后,立即从内存中把数据写到磁盘中(缓冲区:内容写的数据放在缓冲区,缓冲区满了后再写入到磁盘) f.truncate()#清空文件内容 f.close()#关闭文件
5、读取文件的高效方法
read()和readlines()方法操作文件,会先把文件所有内容读到内存中。这样的话,内存数据一多会非常卡。高效的操作,就是读一行操作一行,读过的内容就从内存中释放了
f = open('test',encoding='utf-8') for line in f: #直接循环文件对象,每次循环的时候就是取每一行数据 print('line:',line) #这样的话,line就是每行文件的内容,读完一行的话,就会释放一行的内存
6、自动关文件(使用with)
使用with,它会在使用完这个文件后自动关闭该文件,使用方式如下:
#with 自动关文件 with open('test','r+') as f: f.read() f.write('uuuuuuu') # # #打开多个文件,用逗号隔开 # with open('test','r+') as f,open('test1','w',encoding='utf-8') as fw: # f.read()
7、文件修改(两种方式)
第一种:简单粗暴直接
1)先获取到文件里面所有的内容
2)然后修改内容
3)清空原来文件里面的内容
4)重新写入
f = open('test','a+',encoding='utf-8') f.seek(0) data = f.read() #文件指针到了最后 new_data = data.replace('你','you') f.seek(0) f.truncate() #清空文件内容 f.write(new_data) f.flush() f.close()
第二种:高效的方法
1)先打开原来的文件,再打开一个空文件
2)循环处理原来文件里面每一行数据,处理完之后,写到新文件里面
3)把原来的文件删除,把新文件的名字改成原来文件的名字
#1、前面的空格 #2、把空行去掉 #3、你替换you #4、写到新文件里 #5、把原来的文件删除,把新文件的名字改成原来文件的名字 import os with open('test',encoding='utf-8') as fr,open('.test','w',encoding='utf-8') as fw: for line in fr: #循环文件,读取每一行 line = line.lstrip() #去掉每一行的左边的空格 if line: #判断此行是否为空,不为空继续进行后面的操作 new_linel = line.replace('你','you') fw.write(new_linel) os.remove('test') os.rename('.test','test')
二、集合(set)
集合也是一种数据类型,类似列表。
特点是无序、不重复(集合中没有重复的数据)
集合的作用:
1)可以直接去掉列表中重复的数据
2)可以做关系测试。比如有画画和跳舞两个班,想找出画画和跳舞都学习了得人,就可以用集合
1、集合的定义
创建一个set,用{ }直接定义或使用set()传入一个list参数:
list = [1,2,3,4,5,3,6] set1 = set(list) #使用set()定义集合 set2 = set([1,7,8,9,0]) #把list转化为一个集合 set3 = {'beijing','shanghai','guangzhou'} #直接定义一个集合 print(set1,set2)
如图打印出的结果说明:集合天生去重、无序
2、集合操作
nums = {6,7,1,2,3,4,5} num2 = {1,8,7,12} #交集:取两个集合中都有的 print(nums.intersection(num2) ) print(nums & num2) #并集:合并到一起之后,再去重 print(nums.union(num2)) print(nums|num2) #差集:取出在nums中存在,在num2里面没有 print( nums - num2 ) print(nums.difference(num2)) #对称差集:输出nums和num2中都没有的值,也就是把两个集合中相同的去掉 print(nums.symmetric_difference(num2)) print(nums ^ num2) #子集、父集 print(num2.issubset(nums)) #判断num2是不是nums的子集(num2的值在nums中全有) print(nums.issuperset(num2)) #判断nums是不是num2的父集 print(nums.isdisjoint(num2)) #判断nums和num2是否有交集
增删改操作:
增加:add() update()
删除:remove() pop() discard()
print('---------集合操作--------') list.add(777) #增加,一次只能添加一个 list.update([888,999]) #增加:可同时添加多个 list.remove(999) #删除不存在的元素,会报错 list.pop() #删除一个随机的元素,并返回删除的元素 list.discard(888) # 删除一个不存在的元素 不会报错