Week 3
1 集合操作
1.1 定义
集合是一个无序的,不重复的数据组合,它的主要作用如下:
- 去重,把一个列表变成集合,就自动去重了;
- 关系测试,测试两组数据之前的交集、差集、并集等关系。
1.2 常用操作
list1 = [1,2,3,0,9,4,4,6,6,8,8] list2 = [1,4,6,8] list1 = set(list1) list2 = set(list2) print(list1,type(list1)) # 转为集合去重 print(list1.intersection(list2)) # 交集 like '&',使用运算符两个type都是set print(list1.union(list2)) # 并集 like '|' print(list1.difference(list2)) # 差集 in list1 but not in list2 like '-' print(list1.symmetric_difference(list2)) # 对称差集 in list1 or in list2 but not both in list1 and list2 like '^' print(list1.issubset(list2)) # list1是否为list2的子集 like '<=' print(list1.issuperset(list2)) # list1是否为list2的父集 like '>=' print(list1.isdisjoint(list2)) # 不存在交集返回为ture
list1 = set([1,2,3,0,9,4,4,6,6,8,8]) list2 = set([1,4,6,8]) list2.add(2) # 添加 list2.update([2,0,10]) # 添加多项 print(list2) print(list1.remove(0)) # 指定存在元素删除 print(list1.pop()) # 随机删除元素并返回 print(list1.discard(10)) # 删除不存在元素不报错
2 字符串(补充)
定义:它是一个有序的字符的集合,用于存储和表示基本的文本信息,‘’或“”或‘’‘ ’‘’中间包含的内容称之为字符串。
特性:
1.只能存放一个值
2.不可变
3.按照从左到右的顺序定义字符集合,下标从0开始顺序访问
补充:
1.字符串的单引号和双引号都无法取消特殊字符的含义,如果想让引号内所有字符均取消特殊意义,在引号前面加r,如name=r'l\thf'
2.unicode字符串与r连用必需在r前面,如name=ur'l\thf'
3 文件操作
3.1 文件处理流程
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
#data = open("yesterday once more",encoding='utf-8').read() f =open('yesterday once more','r+',encoding='utf-8') # 文件句柄,将打开的文件对象赋值给变量 first_line = f.readline() print('first line:',first_line) # 读一行 data = f.read() # 光标读完一次,光标在文件最后 print(data) f.write('卡朋特乐队') f.close() # 关闭文件
3.2 文件打开模式
打开文件的模式有:
- r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
- w,只写模式【不可读;不存在则创建;存在则清空内容】
- x, 只写模式【不可读;不存在则创建,存在则报错】
- a, 追加模式【可读;不存在则创建;存在则只追加内容】
"+" 表示可以同时读写某个文件
- r+, 读写【可读,可写】
- w+,写读【可写,可读】
- x+ ,写读【可读,可写】
- a+, 写读【可读,可写】
"b"表示以字节的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码。
3.3 其他操作
f =open('yesterday once more','r+',encoding='utf-8') # 文件句柄,将打开的文件对象赋值给变量 f.seek(0) # 重置文件光标 f.tell() # 光标所在位置 f.truncate(10) # 从10开始截断 f.closed # 文件是否关闭 f.readable() # 文件打开是否可读 f.writable() # 文件打开是否可写 f.flush() # 强制写入硬盘
flush原理:
- 文件操作是通过软件将文件从硬盘读到内存;
- 写入文件的操作也都是存入内存缓冲区buffer(内存速度快于硬盘,如果写入文件的数据都从内存刷到硬盘,内存与硬盘的速度延迟会被无限放大,效率变低,所以要刷到硬盘的数据我们统一往内存的一小块空间即buffer中放,一段时间后操作系统会将buffer中数据一次性刷到硬盘);
- flush即,强制将写入的数据刷到硬盘。
3.4 文件的修改
f = open('yesterday once more','r',encoding='utf-8') f_new = open('yesterday once more.bak','w',encoding='utf-8') for line in f: # 可以用该语句循环读文件,不建议用readline if 'young' in line: line=line.replace('young','old') f_new.write(line) f.close() f_new.close()
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
with open('log1') as obj1, open('log2') as obj2:
4 字符转码
msg = "你好,世界" msg_gbk = msg.decode("unicode").encode("gbk")