Day2补充:集合、文件、字符编码与转码

python

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 sys

2import time

3

4for 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")

3

4for 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

回到顶部