python学习之路day4
书中自有黄金屋,书中自有颜如玉
集合是一个无序的,不重复的数据组合,它的主要作用如下:
去重:把一个列表变成集合,就自动去重了
关系测试:测试两组数据之前的交集、差集、并集等关系
基本操作:
s = set([3,5,9,10]) #创建一个数值集合 自动去重了
t = set("Hello") #创建一个唯一字符的集合
a = t | s # t 和 s的并集
b = t & s # t 和 s的交集 或者写成 b = t.intersection(s)
c = t – s # 求差集(项在t中,但不在s中) 或者写成 c = t.difference(s)
d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中) 并集减去交集
list1.issubset(list2) #若list1是list2的子集,返回True
lsit2.issupperset(list1) #若list2是list1的父集, 返回True
小知识点:
list_1.isdisjoint(list_2) #若list_1与list_2无交集,返回True
基本操作:
t.add('x') # 添加一项
s.update([10,37,42]) # 在s中添加多项 ( 注意update多项元素用中括号【】)
使用remove()可以删除一项: 如果()在集合里不存在,则报错;而discard()则返回None
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”的一个浅复制
文件操作
思想:打开>>操作>>关闭
小知识点:在windows下打开文件默认编码格式为GBK,而python默认编码为unicode(utf-8),因此在用open()打开文件时不输入encoding="utf-8"就会处理不了GBK格式文件
f=open('文件名',encoding='utf-8') # f就是文件内存对象(文件句柄)
文件的写入
f=open('文件名',encoding='utf-8') #f就是文件内存对象
PS:完整格式为
f=open('文件名','r',encoding='utf-8') # "r", "w", "a" (read, write, append)
"w"为创建新的文件并将写入的内容覆盖掉原本的文件内容!也可以写入,格式:f.write("--------")
"a"为追加内容,写入的内容不覆盖原来的文件内容,写入格式:f.write("----------")
文件的读取
data=f.read() #data已经“读完了”一遍文件,光标已经指向最末位
data2=f.read() #data2为空值,因为data已经“读完了”一遍文件,光标已经指向最末位,再次读取当然是空值了
print(f.tell()) #打印当前光标的位置,按读了的字符计数
f.seek(0) #光标又移动到0 ###seek()即为光标的跳转
print(f.readline()) #打印第一行
f.readline()仅仅是一行内容,f.readlines()则是把所有内容按行形成列表,形如['111111------------\n', '222222------------\n'],
f.readline()只适合读小文件,大文件要加载很长时间(整个文件全部放在内存里)
解决方法:内存中只保存一行数据,读一行删一行
low loop :
for index, line in enumerate(f.readlines()):
if index!= 9: #不打印第十行
print(line.strip()) #虽然去掉了换行(\n),但是是一句句打印的
也可这样写:
for index, line in enumerate(f.readlines()):
if index == 9:
print('------我是分割线-------')
continue
print(line.strip())
High bige:效率最高,内存中只保存一行数据
f=open('yesterday','r',encoding='utf-8')
for line in f: #这里的f不是列表,迭代替
print(line)
对第十行进行特别的操作:
f=open('yesterday','r',encoding='utf-8')
count=0
for line in f:
count +=1
if count == 10 :
print('------我是分割线------')
print(line.strip())
print(f.encoding) #打印文件的编码(utf-8还是别的)
f.flush() #把之前写入的数据(实际上存在缓存里)实时刷新写到硬盘里
进度条(伪?):结果是#一个个出现
import sys, time
for i in range(20):
sys.stdout.write("#")
sys.stdout.flush()
time.sleep(0.1)
f.closed 判断是否关闭 返回True or False
f=open('yesterday2','a',encoding='utf-8') #注意这里是'a',若为'w'肯定覆盖了原文件
#f.truncate() #不写就把文件yesterday2清空
f.truncate(10) #从头开始截断,不论光标在什么位置
既能读又能写:
读写模式:“r+” 最常用
f=open('yesterday2','r+',encoding='utf-8') #以读和追加(从最后开始追加)的模式打开,不论光标在什么位置
写读模式:“w+”
追加读写:“a+”
"+" 表示可以同时读写某个文件
- r+,可读写文件。【可读;可写;可追加】【只能在最后写入】
- w+,写读 【覆盖掉】
- a+,同a
- rb,打开二进制文件(视频)
- 同理有wb,ab
f.write("hello\n".encode()) #把字符串转换成二进制再进行写入
对文件进行修改
1.将文件加载到内存里,在内存里修改完后写回原文件;
(在硬盘里修改的话只能覆盖原文件的内容。)
2.打开文件,修改后存到新的文件
思路:同时打开两个文件,一个读,一个写
f = open("yesterday2",'r',encoding='utf-8')
f_new = open("yesterday2.new.",'w',encoding='utf-8')
for line in f : #对每一行逐一查找并写入到f_new
if "肆意的快乐等我享受" in line :
line=line.replace("肆意的快乐等我享受","肆意的快乐等Alex享受")
#old new
f_new.write(line) # 写入 line 到 f_new这个文件对象
f.close()
f_new.close()
知识点:sys.argv[number]用于传递参数
Sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径,所以参数从1开始
比如上例把old和new设成参数:
目前还不太清楚怎么弄QAQ
import sys
f = open("yesterday2",'r',encoding='utf-8')
f_new = open("yesterday2.new.",'w',encoding='utf-8')
find_str=sys.argv[1]
replace_str=sys.argv[2]
for line in f : #对每一行逐一查找并写入到f_new
if find_str in line :
line=line.replace(find_str,replace_str)
#old new
f_new.write(line) # 写入 line 到 f_new这个文件对象
f.close()
f_new.close()
with 用法
用来自动关闭文件(防止你忘记关闭)
with open("yesterday2",'r',encoding='utf-8') as f:
-----------------------------------------------------
f = open("yesterday2",'r',encoding='utf-8')
-----------------------------------------------------
效果相同,但是with语句不用输入f.close(),并且with可以同时打开多个文件:
with
open
(
'log1'
) as obj1,
open
(
'log2'
) as obj2:
一点代码规范:代码的换行 ,\
with open("yesterday2",'r',encoding='utf-8') as f,\
open("yesterday2",'r',encoding='utf-8') as f2:
小知识:ascii码里只能存英文和特殊字符,一个英文只占一个字节,8位
unicode不论中英文还是什么文都是两个字节,16位
为了解决unicode占用空间过多的问题,出现了UTF-8(可伸缩的字符编码)(英文还是ascii码形式,中文字符统一三个字节)
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
#-*-coding:gb2312 -*- #这个也可以去掉
__author__ = 'Alex Li'
import sys
print(sys.getdefaultencoding())
msg = "我爱北京天安门"
#msg_gb2312 = msg.decode("utf-8").encode("gb2312")
msg_gb2312 = msg.encode("gb2312") #默认就是unicode,不用再decode,喜大普奔
gb2312_to_unicode = msg_gb2312.decode("gb2312")
gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")
print(msg)
print(msg_gb2312)
print(gb2312_to_unicode)
print(gb2312_to_utf8)