Python中的文件操作详解

在Python编程中,文件操作是一项非常基础且重要的技能。无论是读取配置文件、处理日志数据,还是保存用户信息,都离不开对文件的读写操作。Python提供了简洁而强大的内置函数和方法来处理各种文件类型。本文将详细介绍Python中常见的文件操作方式。


一、基本概念:什么是文件操作?

文件操作指的是程序与计算机文件系统之间的交互,主要包括:

  • 打开文件
  • 读取文件内容
  • 写入或修改文件内容
  • 关闭文件

Python通过内置的 open() 函数来实现这些操作。


二、打开文件:open() 函数

open() 是进行文件操作的第一步,其基本语法如下:

file_object = open(file_path, mode, encoding=None)

参数说明:

参数 含义
file_path 文件路径(可以是相对路径或绝对路径)
mode 打开模式(如只读、写入等)
encoding 编码格式(常用 utf-8)

常见打开模式:

模式 描述
'r' 只读模式(默认),文件必须存在
'w' 写入模式,若文件存在则清空内容,不存在则创建
'a' 追加模式,写入内容添加到文件末尾
'x' 创建新文件并写入,若文件已存在则失败
'b' 以二进制模式打开(如 'rb', 'wb')
't' 文本模式(默认)
'+' 可读可写(如 'r+', 'w+')

示例:以 UTF-8 编码打开一个文本文件用于读取

f = open('example.txt', 'r', encoding='utf-8')


三、读取文件内容

打开文件后,可以使用多种方法读取内容。

1. read() ------ 读取全部内容

with open('example.txt', 'r', encoding='utf-8') as f:

content = f.read()

print(content)

2. readline() ------ 逐行读取(每次读一行)

with open('example.txt', 'r', encoding='utf-8') as f:

line = f.readline()

while line:

print(line.strip()) # strip() 去除换行符

line = f.readline()

3. readlines() ------ 读取所有行,返回列表

with open('example.txt', 'r', encoding='utf-8') as f:

lines = f.readlines()

for line in lines:

print(line.strip())

4. 推荐方式:直接迭代文件对象(高效且节省内存)

with open('example.txt', 'r', encoding='utf-8') as f:

for line in f:

print(line.strip())


四、写入文件内容

1. 使用 write() 写入字符串

with open('output.txt', 'w', encoding='utf-8') as f:

f.write("Hello, Python!\n")

f.write("这是第二行。\n")

2. 使用 writelines() 写入字符串列表

lines = "第一行\\n", "第二行\\n", "第三行\\n"

with open('output.txt', 'w', encoding='utf-8') as f:

f.writelines(lines)

注意:writelines() 不会自动添加换行符,需手动在每行末尾加上 \n。


五、使用 with 语句管理文件(推荐做法)

使用 with 语句可以确保文件在使用后自动关闭,即使发生异常也不会导致资源泄露。

with open('data.txt', 'r', encoding='utf-8') as f:

content = f.read()

print(content)

文件在此处已自动关闭

对比传统方式(不推荐):

f = open('data.txt', 'r', encoding='utf-8')

content = f.read()

print(content)

f.close() # 忘记 close 可能造成问题


六、处理不同类型的文件

1. CSV 文件(可使用 csv 模块)

import csv

读取 CSV

with open('students.csv', 'r', encoding='utf-8') as f:

reader = csv.reader(f)

for row in reader:

print(row)

写入 CSV

with open('students.csv', 'w', encoding='utf-8', newline='') as f:

writer = csv.writer(f)

writer.writerow('Name', 'Age', 'City')

writer.writerow('Alice', 23, 'Beijing')

注意:写入 CSV 时添加 newline='' 防止空行。

2. JSON 文件(使用 json 模块)

import json

写入 JSON

data = {'name': 'Bob', 'age': 25, 'city': 'Shanghai'}

with open('data.json', 'w', encoding='utf-8') as f:

json.dump(data, f, ensure_ascii=False, indent=4)

读取 JSON

with open('data.json', 'r', encoding='utf-8') as f:

loaded_data = json.load(f)

print(loaded_data)

3. 二进制文件(如图片、音频)

复制图片文件

with open('photo.jpg', 'rb') as src:

with open('copy_photo.jpg', 'wb') as dst:

dst.write(src.read())


七、常见异常处理

在文件操作中,可能会遇到文件不存在、权限不足等问题,建议使用 try-except 处理:

try:

with open('nonexistent.txt', 'r', encoding='utf-8') as f:

content = f.read()

except FileNotFoundError:

print("文件未找到!")

except PermissionError:

print("没有权限访问该文件。")

except Exception as e:

print(f"发生错误:{e}")


八、实用技巧与注意事项

  1. 始终指定编码 :尤其是在处理中文时,强烈建议使用 encoding='utf-8'。
  2. 优先使用 with 语句:避免忘记关闭文件。
  3. 路径处理建议使用 os.path 或 pathlib:

from pathlib import Path

file_path = Path("folder") / "example.txt"

if file_path.exists():

with open(file_path, 'r', encoding='utf-8') as f:

print(f.read())

  1. 大文件处理注意内存 :不要一次性 read() 超大文件,应逐行处理。

九、总结

Python 的文件操作简单直观,功能强大。掌握以下几点即可应对大多数场景:

  • 使用 open() 打开文件
  • 正确选择 mode 和 encoding
  • 用 with 确保安全关闭
  • 熟练运用 read(), readline(), write() 等方法
  • 结合 csv、json 模块处理结构化数据
  • 添加异常处理提升程序健壮性

通过合理使用这些技术,你可以轻松地在 Python 中完成日志记录、数据导入导出、配置管理等各种任务。


🎯 小练习 :

编写一个程序,读取一个文本文件,统计其中每一行的字符数,并将结果写入另一个文件中。

with open('input.txt', 'r', encoding='utf-8') as fin, \

open('output.txt', 'w', encoding='utf-8') as fout:

for i, line in enumerate(fin, 1):

char_count = len(line.strip())

fout.write(f"第{i}行: {char_count}个字符\n")

相关推荐
论文复现现场19 分钟前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
志尊宝25 分钟前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
啃瓜子的松鼠37 分钟前
泛微OAe9-后端二开异步调用
java
benchmark_cc1 小时前
用 Python 拉 A 股全市场实时快照:Notebook 请求、结果校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
伞伞悦读1 小时前
【第70期】Adam二阶矩不是方差:偏差校正、动量与AdamW完整实验
python
FRing031 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
秋天的怀念_David1 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
excel2 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放2 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友