一、文件操作基础

1. 为什么需要文件操作?

之前写的程序,数据在运行结束后就消失了。实际开发中,需要将数据存储到硬盘上,实现持久化保存。

2. 文本文件 vs 二进制文件
类型 存储方式 能否用记事本打开 常见格式
文本文件 普通字符(unicode) .txt、.py、.csv
二进制文件 字节 不能 .mp4、.mp3、.jpg、.doc
3. 文件打开模式
模式 描述
r 读模式
w 写模式(文件不存在则创建,存在则覆盖)
a 追加模式(文件不存在则创建,存在则在末尾追加)
b 二进制模式(可与r/w/a组合,如rbwb
+ 读写模式(可与r/w/a组合,如r+

二、文本文件写入

1. 基本三步走
# 1. 创建文件对象
f = open('hello.txt', 'w')

# 2. 写入数据
f.write('itYus\next\n')

# 3. 关闭文件
f.close()
2. 中文乱码问题

Windows默认编码是GBK,Linux是UTF-8。写入中文时需要指定编码:

f = open(r"b.txt", "w", encoding="utf-8")
f.write("云生\n云生\n")
f.close()
3. with语句(推荐写法)

with 语句能自动管理资源,无论是否发生异常,都会自动关闭文件。

str = ["云生", "云生", "云生"]
with open("b.txt", "w", encoding="utf-8") as f:
    f.writelines(str)

对比

写法 优点 缺点
f = open(); ...; f.close() 灵活 容易忘记关闭,异常时不安全
with open() as f: 自动关闭,异常安全

三、文本文件读取

1. 三种读取方法
方法 作用 示例
read(size) 读取指定字符数,省略则读取全部 f.read(4)
readline() 读取一行 f.readline()
readlines() 每行作为元素存入列表返回 f.readlines()
2. 读取示例
# 读取前4个字符
with open("b.txt", "r", encoding="utf-8") as f:
    print(f.read(4))

# 一次读取整个文件
with open("b.txt", "r", encoding="utf-8") as f:
    print(f.read())

# 逐行读取
with open("b.txt", "r", encoding="utf-8") as f:
    while True:
        line = f.readline()
        if not line:
            break
        print(line, end="")

四、二进制文件读写

处理图片、视频等非文本文件时,需要指定二进制模式。

# 复制图片(二进制读取 + 二进制写入)
with open('5.jpg', 'rb') as srcFile, open("copy.png", 'wb') as desFile:
    for line in srcFile:
        desFile.write(line)

五、文件对象的常用属性和方法

1. 文件属性
属性 说明
name 返回文件名
mode 返回打开模式
closed 文件是否已关闭(布尔值)
2. 常用方法
方法 说明
read(size) 读取指定字符/字节数
readline() 读取一行
readlines() 每行作为列表元素返回
write(str) 将字符串写入文件
writelines(list) 将字符串列表写入文件(不自动加换行)
seek(offset, whence) 移动文件指针(0开头/1当前/2末尾)
tell() 返回当前指针位置
flush() 将缓冲区内容写入文件但不关闭
close() 写入缓冲区并关闭文件
3. seek()移动文件指针示例
with open("hello.txt", "r", encoding="utf-8") as f:
    print(f.tell())           # 当前指针位置
    print(f.readline())       # 读取一行
    print(f.tell())           # 指针已移动
    f.seek(0)                 # 指针回到开头
    print(f.readline())       # 再次读取第一行

六、pickle序列化

序列化:将对象转换为可存储或传输的格式。
反序列化:将存储的数据恢复为对象。

import pickle

# 序列化(存储)
with open("data.dat", "wb") as f:
    name = "iwen"
    age = 34
    resume = {'name': name, 'age': age, 'score': [90, 80, 70]}
    pickle.dump(resume, f)

# 反序列化(读取)
with open("data.dat", "rb") as f:
    resume = pickle.load(f)
    print(resume)  # {'name': 'iwen', 'age': 34, 'score': [90, 80, 70]}

七、CSV文件操作

CSV是逗号分隔值文件,常用于数据交换和表格数据处理。

1. 读取CSV
import csv
with open("list.csv") as csvfile:
    reader = csv.reader(csvfile)
    header = next(reader)    # 读取标题行
    print(header)
    for row in reader:       # 逐行读取数据
        print(row)
2. 写入CSV
import csv
headers = ["姓名", "年龄", "工作", "薪资"]
rows = [
    ('yus', '20', '北京', '22'),
    ('yus', '20', '北京', '22')
]
with open("list.csv", "w", encoding="utf-8", newline="") as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(headers)    # 写入标题行
    writer.writerows(rows)      # 写入多行数据

注意:Windows下写入CSV时,建议加上 newline="" 避免出现多余空行。

八、OS模块

os模块可以直接与操作系统交互,执行文件/目录操作或调用系统命令。

1. 调用系统命令
import os
os.system("calc.exe")           # 打开计算器
os.system("ping www.baidu.com") # 执行ping命令
os.startfile("微信路径")         # 直接运行可执行文件
2. 文件和目录操作
方法 说明
os.remove(path) 删除文件
os.rename(src, dest) 重命名文件或目录
os.stat(path) 返回文件属性
os.listdir(path) 列出目录下的文件和子目录
os.mkdir(path) 创建单级目录
os.makedirs(path) 创建多级目录
os.rmdir(path) 删除目录
os.removedirs(path) 删除多级目录
os.getcwd() 返回当前工作目录
os.chdir(path) 切换工作目录
3. 常用属性
属性 说明
os.name 操作系统类型(nt=Windows, posix=Linux)
os.sep 路径分隔符(Windows为\,Linux为/)
os.linesep 换行符(Windows为\r\n,Linux为\n)

今日核心总结

  1. 文件写入三步骤open()write() / writelines()close()
  2. 推荐使用 with 语句:自动管理文件关闭,防止资源泄漏
  3. 中文编码:写入中文时指定 encoding="utf-8"
  4. 三种读取方法read()(全部/指定字符)、readline()(一行)、readlines()(列表)
  5. 二进制模式:处理图片/视频时加 b,如 rbwb
  6. pickle序列化:将Python对象存入文件,读取时恢复为对象
  7. CSV操作csv.reader() 读取,csv.writer() 写入,注意Windows加 newline=""
  8. OS模块:调用系统命令、管理文件和目录、获取系统信息

更多推荐