Python学习文件操作与集合

一、文件操作

现有以下文件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)   # 删除一个不存在的元素 不会报错
原文地址:https://www.cnblogs.com/ddxxn/p/9222065.html