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.pathpathlib

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() 打开文件
  • 正确选择 modeencoding
  • with 确保安全关闭
  • 熟练运用 read(), readline(), write() 等方法
  • 结合 csvjson 模块处理结构化数据
  • 添加异常处理提升程序健壮性

通过合理使用这些技术,你可以轻松地在 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")

相关推荐
q_30238195562 小时前
秒级筛查+94.7%精准!华为Atlas 200 DK边缘设备解锁糖尿病视网膜病变检测新范式
人工智能·python·深度学习·智能体
Moment2 小时前
一文搞懂 Tailwind CSS v4 主题变量映射背后的原理
前端·javascript·面试
我命由我123452 小时前
JavaScript WebGL - WebGL 引入(获取绘图上下文、获取最大支持纹理尺寸)
开发语言·前端·javascript·学习·ecmascript·学习方法·webgl
辛-夷2 小时前
2025年高频面试题整理(vue系列一)
前端·javascript·vue.js·前端框架
GISer_Jing2 小时前
ByteDance AI战略:前端生态的颠覆者
前端·人工智能·aigc
程序猿零零漆2 小时前
Spring之旅 - 记录学习 Spring 框架的过程和经验(一)BeanFactory和ApplicationContext入门和关系
java·学习·spring
AndrewHZ2 小时前
【python与生活】从手机定位到车辆导航:GPS定位算法原理与Python实现
python·智能手机·生活·gps·定位算法·北斗卫星·车辆导航
凌冰_2 小时前
Thymeleaf 访问域对象
java·开发语言
白露与泡影2 小时前
Java单元测试、集成测试,区别
java·单元测试·集成测试