第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_函数进阶

装饰器生成器迭代器及python中内置函数的使用

python迭代器,生成器,装饰器

python学习第四天,列表生产式,匿名函数,生成器,内置函数,迭代器,装饰器,json和pickle的序列化和反序列化