参考文档
http://www.cnblogs.com/alex3714/articles/5717620.html
集合
集合是一个无序的,不重复的数据组合,它的主要作用如下:
去重:把一个列表变成集合,就自动去重了
关系测试:测试两组数据之前的交集、差集、并集等关系
常用操作
list_1 = [1, 4, 6, 7, 4, 6, 9]
list_1 = set(list_1)
print(list_1, type(list_1))
list_2 = set([2, 4, 6, 32, 21])
print(list_1, list_2)
print(list_1.intersection(list_2)) # 取出交集
print(list_1.union(list_2)) # 并集
print(list_1.difference(list_2)) # 差集|list_1里面有,list_2里面没有
print(list_1.issubset(list_2)) # 子集
print(list_1.issuperset(list_2)) # 父集
print(list_1.isdisjoint(list_2)) #是否有交集
运算符
print(list_1 & list_2) # 交集
print(list_1 | list_2) # 并集
print(list_1 - list_2) # 差集
print(list_1 ^ list_2) # 对称差集
s = set([3,5,9,10]) #创建一个数值集合
t = set("Hello") #创建一个唯一字符的集合
a = t | s # t 和 s的并集
b = t & s # t 和 s的交集
c = t – s # 求差集(项在t中,但不在s中)
d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中)
基本操作:
t.add('x') # 添加一项
s.update([10,37,42]) # 在s中添加多项
使用remove()可以删除一项:
t.remove('H')
len(s)
set 的长度
x in s
测试 x 是否是 s 的成员
x not in s
测试 x 是否不是 s 的成员
s.issubset(t)
s <= t
测试是否 s 中的每一个元素都在 t 中
s.issuperset(t)
s >= t
测试是否 t 中的每一个元素都在 s 中
s.union(t)
s | t
返回一个新的 set 包含 s 和 t 中的每一个元素
s.intersection(t)
s & t
返回一个新的 set 包含 s 和 t 中的公共元素
s.difference(t)
s - t
返回一个新的 set 包含 s 中有但是 t 中没有的元素
s.symmetric_difference(t)
s ^ t
返回一个新的 set 包含 s 和 t 中不重复的元素
s.copy()
返回 set “s”的一个浅复制
文件操作
f = open('lyrics',encoding='utf-8') #打开文件
first_line = f.readline()
print('first line:',first_line) #读一行
print('我是分隔线'.center(50,'-'))
data = f.read()# 读取剩下的所有内容,文件大时不要用
print(data) #打印文件
f.close() #关闭文件
打开文件的模式有:
r,只读模式(默认)
w,只写 [不可读:不存在则创建,存在则删除内容;]
a,追加 [可读:不存在则创建,存在则只追加内容(在末尾追加);]
"+" 表示可以同时读写某个文件
r+,可读写文件 [可读|可写|可追加]
w+,写读
a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
rU
r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
rb
wb
ab
with语句
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
----------
with open('log','r') as f:
...
----------
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
'''
# 注意制定编码格式|打开文件并且把内容读出来
# data = open('yestady', encoding='utf-8').read()
# 注意必须按标准打开文件(文件名|打开格式)
w:创建文件|覆盖之前的
# 文件句柄(包含|文件名|字符集|文件内容起始位置等)
a:append追加|追加在文件后面|不能读
r+ 读写|追加:在末尾追加
w+ 写读|先创建一个文件再写|源文件被清空
a+ 追加读|可以追加读
rb 二进制格式去读文件|使用:网络socket传输
wb 二进制文件写|直接写,不能读
'''
操作实例
f = open('yestady','rw+', encoding='utf-8') #打开文件的正确姿势
# 打开文件|赋给f的是一个内存对象(文件句柄(字符集|大小|位置等))
data = f.read()
data2 = f.read()
print(data)
print('---data---', data2)
f.read()
f.read() #一次性读所有|只适合读小文件
f.write(str)
'''
w写
需要有w模式,但是 w 打开是创建一个文件,故会覆盖之前的文件
如果需要写多行,记得加\n
'''
打印前5行
----------
for i in range(5):
print(f.readline().strip()) #去掉换行
----------
第10行不打印(low)
----------
for index,line in enumerate(f.readlines()):
if index ==9:
print('---我是分割线---')
continue
print(line.strip())
----------
第10行不打印(此方法更高效)
----------
count = 0
for line in f:
print(line.strip()) # 已变成迭代器|只保存当前的一行
count += 1
if count == 9:
print('---我是分割线---')
continue
----------
文件句柄
----------
print(f.tell()) # 读取文件句柄的位置
print(f.readline())
print(f.tell()) # 根据字符计数
f.seek(0) # 移动文件句柄的位置
print(f.tell())
print(f.encoding) # 打印文件编码
----------
print(f.isatty()) # 查看是否是终端设备
print(f.seekable()) # 是否可以移动句柄
print(f.readable()) # 判断文件是否可读
print(f.writable()) # 判断文件是否可写
flush方法打印进度条
import sys, time
for i in range(20):
sys.stdout.write('-*')
sys.stdout.flush()
# 每打印一个刷新一次,否则会等缓存区满了一次性打印出来
time.sleep(0.1)
文件修改
f = open('yestady', 'r', encoding='utf-8')
f_new = open('yestady.back', 'w', encoding='utf-8')
for line in f:
if '就如夜晚的微风' in line:
line = line.replace('就如夜晚的微风', 'So clod!!')
f_new.write(line)
f.close()
f_new.close()
with操作文件
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
with open('yestady', 'r', encoding='utf-8') as f:
for line in f:
print(line.strip())
同时打开多个文件
with open('yestady', 'r', encoding='utf-8') as f, \
open('yestady.back', 'r', encoding='utf-8') as f2:
#代码规范性(每行不超过80个字符)
程序练习
1.实现简单的shell sed 替换功能
2.修改haproxy配置文件
字符编码与转码
unicode 万国码
详细文章:
http://www.cnblogs.com/yuanchenqi/articles/5956943.html
http://www.diveintopython3.net/strings.html
需知:
1.在python2默认编码是ASCII, python3里默认是unicode
2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
#不同编码之间的转换,都必须经过unicode
import sys
print(sys.getdefaultencoding()) #打印字符编码格式
s = '你好'
print(s.encode('gbk'))
print(s.encode('gbk').decode('gbk').encode('gb2312'))
print(s.encode('gbk').decode('gbk').encode('gb2312').decode('gb2312'))