1

为什么需要文件操作?

想象一下,你开发了一个很棒的程序,但每次关闭程序后所有数据都消失了,这显然不是我们想要的!文件操作可以帮助我们:

  • 持久化保存程序数据
  • 读取配置文件或用户数据
  • 处理日志文件
  • 导入/导出数据
  • 存储用户设置
小贴士: Python处理文件非常简单直观,就像在现实中操作文件一样:打开文件 → 进行操作 → 关闭文件。
2

打开文件 – open()函数

Python使用内置的open()函数来打开文件。基本语法如下:

# 基本格式:open(文件名, 模式)
file = open(“example.txt”, “r”)

文件打开模式

在打开文件时,需要指定文件模式,告诉Python你想对文件做什么操作:

模式 说明 文件不存在时
“r” 只读模式(默认) 报错
“w” 写入模式(覆盖原有内容) 创建新文件
“a” 追加模式(在末尾添加内容) 创建新文件
“x” 创建模式(仅创建新文件) 报错(文件已存在时)
“b” 二进制模式(如图片、视频)
“t” 文本模式(默认)
“+” 读写模式(可读可写)
# 示例:打开文件的各种方式
file1 = open(“data.txt”) # 默认只读文本模式
file2 = open(“image.png”, “rb”) # 二进制只读模式
file3 = open(“log.txt”, “a”) # 追加模式
file4 = open(“newfile.txt”, “w”) # 写入模式,创建新文件
重要提醒: 使用”w”模式时要特别小心,它会清空文件原有内容!
3

读取文件内容

打开文件后,Python提供了多种读取内容的方法:

方法 说明
read(size) 读取指定字节数,不指定则读取全部内容
readline() 读取一行内容
readlines() 读取所有行,返回列表
# 示例:读取文件内容
file = open(“example.txt”, “r”)

# 读取整个文件
content = file.read()
print(content)

# 读取前10个字符
partial = file.read(10)
print(partial)

# 逐行读取
line = file.readline()
while line:
    print(line.strip()) # strip()去除行尾换行符
    line = file.readline()

# 关闭文件!
file.close()

更简洁的读取方式

你可以直接遍历文件对象来读取文件内容:

with open(“example.txt”) as file:
    for line in file:
        print(line.strip())
最佳实践: 处理文本文件时,使用for line in file的方式最安全和高效,尤其对大文件。
4

写入文件内容

Python提供了多种写入文件的方法:

方法 说明
write(string) 写入字符串内容
writelines(list) 写入字符串列表
# 示例:写入文件内容
# 创建新文件并写入
file = open(“new_file.txt”, “w”)
file.write(“Hello, World!\n”)
file.write(“This is a new line.\n”)
file.close()

# 向已有文件追加内容
file = open(“existing.txt”, “a”)
file.write(“Appending a new line at the end.\n”)
file.close()

# 使用writelines写入多行
lines = [“First line\n”, “Second line\n”, “Third line\n”]
file = open(“multiple_lines.txt”, “w”)
file.writelines(lines)
file.close()
重要提示: 使用write()方法时不会自动添加换行符(\n),需要手动添加!
5

安全操作文件 – with语句

直接使用open()close()容易忘记关闭文件,导致资源泄露。Python提供了更安全的with语句:

# 使用with语句打开文件
with open(“example.txt”, “r”) as file:
    data = file.read()
    print(data)

# 文件会在退出with块后自动关闭
# 即使发生异常也会正确关闭!

with语句的优点

  • 自动处理文件的打开和关闭
  • 代码更简洁易读
  • 异常安全 – 即使出错也会关闭文件
  • 减少资源泄漏的风险
强烈建议: 在大多数情况下都应该使用with语句来操作文件!
6

文件指针操作

当你读写文件时,Python内部有一个”指针”标记当前位置。理解指针有助于更灵活地操作文件:

方法 说明
tell() 返回当前指针位置
seek(offset, whence) 移动指针到指定位置
# 示例:文件指针操作
with open(“example.txt”, “r”) as file:
    # 读取前10个字符
    print(file.read(10))
    
    # 查看当前指针位置
    print(“Current position:”, file.tell()) # 输出: 10
    
    # 将指针移动到文件开头
    file.seek(0)
    print(“Moved to start:”, file.tell()) # 输出: 0
    
    # 移动到文件末尾
    file.seek(0, 2) # 0表示偏移量,2表示从文件末尾
    print(“At end:”, file.tell()) # 输出文件总长度
何时使用: 当你需要重复读取文件内容或在文件中跳转时,seek()和tell()非常有用!
7

文件操作最佳实践

以下是一些文件操作的实用技巧和注意事项:

1. 文件路径处理

# 使用os模块处理路径
import os

# 拼接路径更安全
file_path = os.path.join(“folder”, “subfolder”, “file.txt”)

# 检查文件是否存在
if os.path.exists(“data.txt”):
    print(“文件存在”)
else:
    print(“文件不存在”)

2. 处理不同编码

处理非ASCII字符时需要指定编码:

# 读取UTF-8编码文件
with open(“utf8_file.txt”, “r”, encoding=”utf-8″) as file:
    content = file.read()

# 写入UTF-8文件
with open(“new_utf8.txt”, “w”, encoding=”utf-8″) as file:
    file.write(“包含中文的内容”)

3. 大文件处理技巧

避免的做法

一次性读取整个大文件到内存

# 可能耗尽内存!
with open(“huge_file.log”) as f:
    content = f.read()

推荐的做法

逐行或分块处理

# 安全高效的方式
with open(“huge_file.log”) as f:
    for line in f:
        process_line(line)
编码建议: 当不确定文件编码时,可以尝试使用chardet库自动检测文件编码。