Day2补充:集合、文件、字符编码与转码
1.集合 使用{}存储
主要作用:
①去重,把两个列表变成集合,就自动去重了
②关系测试,测试两组数据之前的交集、差集、并集等关系
将列表转化为集合,set命令强制转换即可
关系运算:
交集:intersection命令 或 &
并集:union命令 或 |
差集:difference命令 或 -
子集:issubset命令
父集:issuperset命令
对称差集:symmetric_difference命令 或 ^,对于A、B两个集合,该命令输出为A∪B-A∩B(将两个集合里分别独有的元素取出来放在一起)
判断两集合是否有相同元素:isdisjoint命令
#以上操作不更改原集合
#以下操作更改原集合
添加一项元素:add命令
添加多项元素:update命令配合列表
删除一项元素:remove命令(元素不存在报错)/discard命令(元素不存在返回None)/pop命令 随机删除,返回删除的元素值
长度:len命令
判断元素在集合内:in 命令
判断元素不在集合内: not in命令
intersection_update:求交集并将其更新在原集合中(intersection是生成在新集合中不改变原集合)
difference_update、symmetric_difference_update同理
1 list1 = [1, 3, 4, 7, 5, 3, 9] 2 A = set(list1) 3print(list1, type(list1)) 4 list2 = [2, 22, 66, 4, 7, 55] 5 B = set(list2) 6print("集合A:", A, "", "集合B:", B) 7print("33[31m下面是集合操作33[0m".center(30, "-")) 8# 交集9print("A、B求交", A.intersection(B), A & B)
10# 并集
11print("A、B求并:", A.union(B), A | B)
12# 差集
13print("A-B:", A.difference(B), A - B)
14print("B-A:", B.difference(A), B - A)
15# 子集
16print("A是B的子集?", A.issubset(B))
17# 父集
18print("A是B的父集?", A.issuperset(B))
19# 对称差集
20print("对称差集", A.symmetric_difference(B), A ^ B)
21# 判断两集合是否有相同元素
22print(A.isdisjoint(B))
23print("33[31m结束33[0m".center(30, "-"))
24print(A, B) # 上述集合操作并未更改原集合
25
26# 添加一项元素
27 A.add("WK")
28print(A)
29# 添加多项元素
30 A.update([444, 666, 888])
31print(A)
32# 删除一项元素
33 A.remove("WK")
34print(A)
35# 某元素是否在集合内
36print("WK"in A)
37print("WK"notin A)
38print(A.pop())
39print(A)
40 A.discard(888)
41print(A)
Set
1 [1, 3, 4, 7, 5, 3, 9] <class"list">2 集合A: {1, 3, 4, 5, 7, 9}
3 集合B: {2, 66, 4, 7, 22, 55}
4 -------下面是集合操作-------
5 A、B求交 {4, 7} {4, 7}
6 A、B求并: {1, 2, 3, 4, 5, 66, 7, 9, 22, 55} {1, 2, 3, 4, 5, 66, 7, 9, 22, 55}
7 A-B: {1, 3, 5, 9} {1, 3, 5, 9}
8 B-A: {2, 66, 22, 55} {2, 66, 22, 55}
9A是B的子集? False
10A是B的父集? False
11 对称差集 {1, 2, 66, 3, 5, 9, 22, 55} {1, 2, 66, 3, 5, 9, 22, 55}
12False
13 ---结束,上述操作并未更改原集合----
14 {1, 3, 4, 5, 7, 9} {2, 66, 4, 7, 22, 55}
15 {1, 3, 4, 5, "WK", 7, 9}
16 {1, 3, 4, 5, "WK", 7, 9, 888, 666, 444}
17 {1, 3, 4, 5, 7, 9, 888, 666, 444}
18False
19True
20 1
21 {3, 4, 5, 7, 9, 888, 666, 444}
22 {3, 4, 5, 7, 9, 666, 444}
Output-set
2.文件操作
打开文件:
open(‘文件名’) 可指定打开方式(只读、读写……)、编码方式(encoding = ‘编码方式’)、等
文件读写:
不同的打开方式对比如下:
模式
描述
t
文本模式 (默认)
x
写模式,新建一个文件,如果该文件已存在则会报错
b
二进制模式
+
打开一个文件进行更新(可读可写)
U
通用换行模式(不推荐)
r
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式
rb
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等
r+
打开一个文件用于读写。文件指针将会放在文件的开头
rb+
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等
w
打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件
wb
以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等
w+
打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件
wb+
以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等
a
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入
ab
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入
a+
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写
ab+
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写
二进制模式常用于网络传输
r+读写模式的一个注意点:如果打开后不读直接写,会从头开始覆盖;如果读一部分(指针不在开始位置了),再写就会变成追加
读取一行:readline命令 读取某几行:循环加判断即可 (文件操作时,务必注意打开方式)
读取全部:readlines命令 将文档内容读取至列表内
查看指针位置:tell命令
读取指针回归文件开始位置:seek(0)
其他:
isatty命令:文件是否连接到一个终端设备
fileno命令: 返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作
encoding命令:文件编码方式
name命令:返回文件名称
seekable命令:文件读取指针是否可移动
readablewritale命令:文件是否可读/可写
flush命令:用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。一般情况下,文件关闭后会自动刷新缓冲区,但有时需要在关闭前刷新它,这时就可以使用 flush() 方法。
1# low loop 打印yesterday文档内的第36行内容2 f = open("yesterday", encoding="utf-8") # 文件句柄
3for i, line in enumerate(f.readlines()): # readlines命令将文档内容读取并存储至列表内
4if i == 35:
5print(line.strip())
6else:
7continue
8f.close()
9# 用以上readlines命令,要先将所有内容读取一遍到内存里/或readline命令,最后也是把所有内容都存到内存里,故只能处理小文档
10
11# 改进
12 f = open("yesterday", encoding="utf-8")
13 count = 0
14for line in f:
15 count += 1
16if count == 36:
17print(line.strip())
18else:
19continue
20f.close()
21# 用以上命令,内存每次存储一行内容(涉及迭代器,后续学习)
22
23 f = open("yesterday", encoding="utf-8")
24f.readline()
25print(f.tell()) # 查看指针位置
26print(f.readline().strip())
27 f.seek(0) # 指针回归文件开头
28print(f.readline().strip())
29f.close()
30
31 f = open("yesterday", "r+", encoding="utf-8")
32print(f.tell())
33 f.write("奇奇怪怪")
34print(f.tell())
35f.close()
36
37 f = open("yesterday", "r+", encoding="utf-8")
38f.readline()
39 f.write("奇奇怪怪")
40print(f.tell())
41 f.close()
file_operate
有趣的小例子:打印进度条
1import sys2import time34for i in range(100):
5 sys.stdout.write("*") # print每次输出后会自动换行
6 sys.stdout.flush() # 即时刷新缓冲区而非完成后统一写入
7 time.sleep(0.1) # 推迟执行的秒数,使输出过程显示更清晰
进度条
truncate命令:截断命令(截断位置后的内容清除) 可以指定开始位置,不指定则从头开始(指定位置时不以指针位置为标准,始终从头开始计算)
文件修改:
思路:如果全部读取至内存中,对于大文件来说,耗时太长且可能内存不够;故逐行读取,对不需修改的内容,直接读取并写入另一文件,对需要修改的内容,修改后写入另一文件,最终生成的新文件为内容修改后的文件(故修改过程需要两个文件)
1 f = open("yesterday", "r", encoding="utf-8") 2 f_new = open("yesterday_new", "w+", encoding="utf-8") 34for line in f:
5if"奇奇怪怪"in line:
6 line = line.replace("奇奇怪怪", "When I was young (当我小时候)")
7 f_new.write(line)
8f.close()
9f_new.seek(0)
10 update = f_new.read()
11 f = open("yesterday", "w", encoding="utf-8")
12f.write(update)
13f.close()
14 f_new.close()
file_mod
with语句:
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
with open(‘文件名’,’打开方式’,encoding = ‘编码方式’) as …:(可通过逗号隔开同时打开多个文件)
文件操作…
执行完毕自动关闭文件
3.字符编码与转码
详细文章:https://www.cnblogs.com/luotianshuai/articles/5735051.html
查看当前默认编码方式:导入sys模块后用sys.getdefaultencoding命令
查看编码方式:chardet模块下detect命令
以上是 Day2补充:集合、文件、字符编码与转码 的全部内容, 来源链接: utcz.com/z/530561.html