第1章·函数装饰器迭代器内置方法
Posted alexchenx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第1章·函数装饰器迭代器内置方法相关的知识,希望对你有一定的参考价值。
鸡汤之人丑就要读书
推荐:《追风筝的人》《白鹿原》《阿甘正传》《幸德勒的名单》
三元运算
三元运算又称三目运算,是对简单的条件语句的简写,如:
简单条件语句:
if 条件成立: val = 1 else: val = 2
改为三元运算:
val = 1 if 条件成立 else 2
例子:
>>> a = 2 >>> b = 5 >>> val = a if a < b else b >>> val 2 >>> val = a if 3 > 6 else b >>> val 5 >>>
文件处理
假如有一个文件“保密资料.txt”,如何查看里面的内容呢?
1. 安装文本编辑器
2. 选中右键,利用文本编辑器软件打开
3. 查看 or 写入
4. 保存,关闭
以上是我们通常在电脑中对一个文件从打开到关闭的操作流程。
在Python中文件操作分为读、写、修改,我们先从读开始学习。
文件处理-读(r,rb):
文件不存在会报错。
f = open(file="保密资料.txt", mode="r", encoding="utf-8") # 打开文件 data = f.read() # 读文件 print(data) # 输出内容
f.close() # 关闭文件
运行输出内容为:我是测试文件
file="保密资料.txt" 表示文件路径,如果文件不在当前目录要写绝对路径
mode="r" 表示以只读模式打开(还有其他的模式,后面讲述)
encoding="utf-8" 表示将硬盘上的0101010按照utf-8的规则去“断句”,再将“断句”后的每一段0101010转换成unicode的01010101,unicode对照表中有01010101和字符的对应关系
r.read() 表示读取所有内容,内容是已经转换完毕的字符串
f.close() 表示关闭文件
关于编码说明:
如果文件本身是以gbk存的,那么python在打开的时候就需要指定encoding="gbk",如果以utf-8是会乱码的。
二进制模式读文件:
f = open(file="保密资料.txt", mode="rb") # 打开文件 data = f.read() # 读文件
print(data) #输出内容 f.close() # 关闭文件
运行输出内容为:b‘\xe6\x88\x91\xe6\x98\xaf\xe6\xb5\x8b\xe8\xaf\x95\xe6\x96\x87\xe4\xbb\xb6‘
mode为 b 时,就不用写encoding了,因为 b 表示二进制模式,不进行转码,硬盘怎么存的就怎么取出来,但取出来的是二进制数据,不能很好的阅读,所以通常用于网络传输。
智能检测编码的工具:
上面两个例子有啥区别呢?就是在第2个例子中没有指定encoding,因为是直接以rb模式打开了文件,rb是指二进制模式,数据读到内存里直接是bytes格式,如果想看内容,还需要手动decode,因此在文件打开阶段,不需要指定编码。
那么问题来了,假如你不知道你要处理的文件是什么编码的怎么办呢?
有一个工具(chardet)可以告诉你:
f = open(file="测试文件.txt", mode="rb") data = f.read() print(data) # 输出 b‘\xce\xd2\xca\xc7\xb2\xe2\xca\xd4\xce\xc4\xbc\xfe‘ 不可读/不易读 f.close() import chardet # 引入chardet模块 res = chardet.detect(open(file="测试文件.txt", mode="rb").read()) print(res) # 输出 {‘encoding‘: ‘GB2312‘, ‘confidence‘: 0.99, ‘language‘: ‘Chinese‘} 得到文件编码99%可能是GB2312 print(data.decode("GB2312")) # 对二进制数据进行按GB2312解码,正确输出内容:我是测试文件
文件处理-写(w,wb):
文件不存在不会报错,会直接创建一个。文件存在会直接清空掉原有的内容,写入新的内容。
# “路飞学城”是unicode的,写文件的时候以gbk方式进行写入 f = open(file="测试文件2.txt", mode="w", encoding="gbk") f.write("路飞学城") f.close()
wb模式:
f = open("测试文件3.txt", "wb") # f.write("路飞学城") # 直接write的话会报错,TypeError: a bytes-like object is required, not ‘str‘ f.write("路飞学城".encode("gbk")) # “路飞学城”是字符串,需要encode,如果encode什么都不写默认是utf-8,这里我们以gbk来写入 f.close()
文件处理-追加(a,ab):
f = open(file="测试文件3.txt",mode="a",encoding="gbk") f.write("我是追加内容") f.close()
ab模式:
f = open(file="测试文件3.txt",mode="ab") f.write("\n第二行追加内容".encode("gbk")) f.close()
注意:
文件操作时,以“a”或“ab”模式打开,则只能追加,即:在原来内容的尾部追加内容
写到硬盘上时,必须是某种编码的0101010,打开时需要注意:
ab,写入时需要直接传入以某种编码的0100101,即字节类型
a和encoding,写入时需要传入unicode字符串,内部会根据encoding指定的编码将unicode字符串转换为改编码的010101010
文件处理-混合模式(r+,w+):
r+ 模式:
f = open(file="测试文件3.txt", mode="r+", encoding="gbk") data = f.read() # 读文件的内容 print("content:", data) # 打印文件的内容 f.write("\n新内容1") # 写入新内容 f.write("\n新内容2") # 写入新内容 print("new content:", f.read()) # 再次读文件内容 f.close()
运行结果:
content: 第一行内容 第二行内容 新内容1 新内容2 new content:
从运行结果可以看到,之前的内容已经完整输出了,但是后面一次读的时候什么也没有输出来。
因为:
r+ (读写,先读后写,写是追加写):因为文件一打开文件光标在最开始的位置,在读了一遍之后,光标就到了最后了,然后又写入内容到文件,每写完新的内容光标都会依次位移到最后,第二次读的时候没有读到内容,是因为此时的光标已经在最后了,再读的话他会读光标之后的数据,而光标后在最后已经没有数据了,所以读不到。可以通过 f.seek(0) 的方式将光标移到文件开始就可以读到全部内容了。
w+(写读,以写的模式打开,支持读):会先把原来的内容清掉,然后新写入内容,读的话就只能读新写的内容。
w+模式:
f = open(file="测试文件3.txt", mode="w+", encoding="gbk") data = f.read() # 读文件的内容,w模式已经将文件清掉,读不到内容 print("content:", data) # 打印文件的内容 f.write("\n新内容1") # 写入新内容 f.write("\n新内容2") # 写入新内容 print("new content", f.read()) # 再次读文件内容,光标没有在文件开始,读不到内容 f.close()
文件操作的其他方法:
以上是关于第1章·函数装饰器迭代器内置方法的主要内容,如果未能解决你的问题,请参考以下文章
第二模块:函数编程(学位课程):(第1章)函数装饰器迭代器内置方法
python学习第四天,列表生产式,匿名函数,生成器,内置函数,迭代器,装饰器,json和pickle的序列化和反序列化