Python全栈开发 day4 - 文件、迭代器

一、文件

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=" ")

猜你喜欢

转载自www.cnblogs.com/sharef/p/9418979.html
今日推荐