一、文件操作
文件处理b模式,该模式下不能指定编码
Windows模式下空格就是\r\n
而python会自动把\r给去掉,只保留\n,如果不需要这个变换,在open()中指定参数newline=''
文件处理是默认使用t模式,即文本模式,但文件不限于文本,所以需要使用二进制模式,而且可以跨平台
# 文件以字节方式读操作
f = open('a.txt', 'rb')
data = f.read()
print(data)
print('----------------------')
print(data.decode()) #如果想要查看原来的信息,则需要重新把Bytes解码
# 输出
b'124981274\r\n13958\r\n123141\r\n12231\r\n13345323\r\n2352'
----------------------
124981274
13958
123141
12231
13345323
2352
# 文件以字节方式写操作
f = open('a.txt', 'wb') #wb写操作,跟追加ab一样
f.write(bytes('124124\\n', encoding='utf-8'))
f.write('阿瑟东公司'.encode('utf-8'))
f.close()
文件操作的其他方法
函数名 | 功能 |
---|---|
f.encoding() | 返回打开文件时使用的编码方式 |
f.flush() | 将内存中的数据写入文件 |
f.tell() | 返回当前光标位置 |
f.seek(n, mode) | 移动光标到指定位置 |
f.read(n) | 读取指定数量的字符或字节 |
f.truncate(n) | 截取文件至指定字节数(只适用于写模式,不能是"w"或"w+"模式) |
f.readlines() | 读取文件的所有行,并将其作为列表返回 |
二、迭代器
迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走,不能往前走)
可迭代对象:实现了迭代器协议的对象,在对象内部定义了一个__iter__()方法
字符串、列表、元组、字典、集合、文件对象等这些都不是可迭代对象,只不过在for循环时,调用了他们内部的__iter()__方法,把他们变成了可迭代对象
l = [1, 2, 3]
for i in l:
# i = l.__iter()__
# i.__next()__
print(i)
序列类型字符串、列表、元组还可以使用while,下标来访问
当面对非序列类型如字典、集合、文件对象等时,for循环就可以很好的访问【等于while+异常处理】
也可以使用内置函数next(),但本质还是调用__next()__
三、生成器
可以理解为一种数据类型,这种数据类型自动实现了迭代器协议,其本身就是可迭代对象
两种方式
1.生成器函数:常规函数定义,但是用yield语句返回结果,一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行。
2.生成器表达式:类似于列表推到,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。
laomuji = ('鸡蛋%s' %i for i in range(10)) #小括号,比列表解析节省内存
sum()、min()、max()等内置函数也是实现了迭代器协议
三元表达式
表达式1 if 条件 else 表达式2
l = ['鸡蛋%s' %i for i in range(10) if i > 5 ] #也是直接一次性写入内存,因为其本身也是列表