Python3 文件读写 File

程序要长期保存数据(日志、配置、用户信息)就得写文件;读取已有数据则要读文件。 Python 的 open() 函数配合文件对象方法,即可完成几乎所有文件读写需求。

open() 打开文件与模式表

f = open("data.txt", "r")     # 只读模式(默认)
f = open("data.txt", "w")     # 写模式:不存在则创建,存在则清空
f = open("data.txt", "a")     # 追加模式:从文件末尾写入
f = open("data.txt", "r+")    # 读写模式
f = open("img.png", "rb")     # 二进制只读(图片/音频等)
f = open("data.txt", "w", encoding="utf-8")   # 指定编码

模式表:r 只读、w 覆盖写、a 追加、r+ 读写、x 新建独占;加 b 表示二进制,加 + 表示可读可写,b 模式用于处理文本之外的字节数据。

读文件的方法

f = open("poem.txt", "r", encoding="utf-8")
text = f.read()          # 一次读全部内容(字符串)
line = f.readline()      # 读一行
lines = f.readlines()    # 读全部行,返回列表
print(lines)
f.close()                # 用完关闭,释放资源

with 语句自动关闭

忘记 close() 可能造成资源泄漏或数据丢失,推荐用 with:块结束自动关闭文件:

with open("poem.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print(content)
# 缩进块结束,文件已自动关闭

写文件的方法

with open("log.txt", "w", encoding="utf-8") as f:
    f.write("第一行\n")          # 写字符串
    f.writelines(["第二行\n", "第三行\n"])   # 写字符串列表

writelines 不会自动补换行,需自己写 \n;上例表示以 UTF-8 编码写入三行日志。

逐行遍历大文件

超大文件不能一次 read() 进内存,应逐行迭代:

with open("big.log", "r", encoding="utf-8") as f:
    for line in f:                # 文件对象本身可迭代
        print(line.strip())       # strip() 去掉行尾换行

seek 与 tell:文件指针

with open("data.txt", "r+", encoding="utf-8") as f:
    print(f.tell())      # 输出:0,当前指针位置
    f.read(3)            # 读 3 个字符
    print(f.tell())      # 输出:3,指针前移
    f.seek(0)            # 指针跳回开头

编码参数 encoding

读写中文文件强烈建议显式指定 utf-8,否则 Windows 默认编码可能造成乱码:

with open("note.txt", "w", encoding="utf-8") as f:
    f.write("中文内容")

示例:复制文件

with open("src.txt", "r", encoding="utf-8") as src, \
     open("dst.txt", "w", encoding="utf-8") as dst:
    dst.write(src.read())

小结:选对模式 + 指定 utf-8 编码 + 用 with 管理文件生命周期;读大文件逐行遍历, 小文件直接 read()/readlines() 即可。

笔记加载中…