一、文件
1. 处理流程
(1)打开文件,得到文件句柄并赋值给一个变量
(2)通过句柄对文件进行操作
(3)关闭文件
2. 基本操作
# 读文件 f = open("test.txt", mode="r", encoding="utf-8") print(f.readable()) # 是否可读 # print(f.read()) # 读取所有 print(f.readline()) # 读取一行 print(f.readlines()) # 读取所有内容,返回一个列表,每行增加\n 作为一个元素, f.close() # 写 f = open("test.txt", mode="w", encoding="utf-8") # f = open("test.txt", mode="a", encoding="utf-8") # a 以追加方式写入 # f = open("test.txt", mode="r+", encoding="utf-8") # r+ 可读可写 print(f.writable()) f.write("111\n") # 写入内容 f.writelines("222\n") # 写入一行数据 f.writelines(["333\n", "444\n", "555\n"]) # 写入一行数据 f.close()
# *** 推荐使用,无需手动关闭文件 with open("test.txt", "r+", encoding="utf-8") as f: print(f.read()) print(f.encoding) # 打开文件指定的编码 f.flush() f.truncate(20) # 将文件只保留10个字符,从文件头开始 with open("test.txt", "rb") as f: print(f.tell()) # 光标所在位置(字节) print(f.seek(3)) # 控制光标移动,默认0-文件头开始,1-相对位置,2-末尾开始 f.seek(10, 2) print(f.tell()) f.seek(-5, 2) # 从文件末尾开始倒序5个字节 print(f.tell()) with open("test.txt", "w", encoding="utf-8") as f: f.writelines("23278467364\n") # 从一个文件读取内容写入到另一个文件 with open("test.txt", "r", encoding="utf-8") as f,\ open("test_new.txt", "w", encoding="utf-8") as f_new: for line in f: f_new.write(line) with open("test.txt", "rb") as f: # 以二进制方式读取文件,b 模式下不能指定编码 data = f.read() print(data) print(data.decode("utf-8")) with open("test_new.txt", "wb") as f: # 以二进制方式写文件 # f.write(bytes("你好\n", encoding="utf-8")) f.write("你好".encode("utf-8"))
二、迭代器和生成器
1. 迭代器
迭代器协议是指对象必须提供一个next方法,可以通过该方法返回迭代器中的下一项。
可迭代对象:实现了迭代器协议的对象。
迭代器由两个基本方法:iter()、next()
li = [2, 3, 4, 5, 6] it = iter(li) # 生成迭代器 # print(next(it)) # 输出迭代器的下一个元素 for i in it: # 遍历 print(i)
2. 生成器
生成器函数:使用了yield的函数被称为生成器(generator)函数。可以理解为使用 yield 返回结果。调用生成器函数时会返回一个迭代器对象。
生成式表达式:来自迭代和列表解析的组合,返回一个对象,这个对象只有在需要的时候才产生结果。和列表解析类似,但使用圆括号括起来。
# 生成式表达式 li = (i for i in range(20)) print(list(li)) print(type(li))
def fibonacci(n): # 生成器函数 - 斐波那契 a, b, counter = 0, 1, 0 while True: if counter > n: return yield a a, b = b, a + b counter += 1 f = fibonacci(10) # f 是一个迭代器,由生成器返回生成 for i in f: print(i, end=" ")