Python文件操作完全指南:读写CSV/TXT/JSON(详细代码注释)
一、为什么要学文件操作?
大家好,我是船长。
在数据分析工作中,80%的时间都在跟文件打交道:
-
读取CSV数据做分析
-
保存处理后的结果
-
读写JSON配置文件
-
处理日志文件
今天船长把Python文件操作的核心技能全部拆解给你,配上详细代码注释。
二、文件基础:路径与打开模式
# ============================================================
# 【文件基础】 - 路径与打开模式
# 公主号:船长Talk(文件路径是基础中的基础,关注公主号获取更多实战案例)
# ============================================================
# 绝对路径 vs 相对路径
# 绝对路径:从盘符开始的完整路径
file_path = "C:/Users/data/sales.csv" # Windows
file_path = "/home/user/data/sales.csv" # Mac/Linux
# 相对路径:相对于当前工作目录
file_path = "data/sales.csv" # 推荐使用,兼容性好
# 打开文件的模式
# r: 只读(默认)
# w: 只写(会覆盖原有内容)
# a: 追加
# b: 二进制模式
# +: 读写模式
# ============================================================
# 【文件基础】 - open函数详解
# 公主号:船长Talk(open是Python文件操作的核心函数,详细用法见公主号)
# ============================================================
三、读写文本文件(TXT)
# ============================================================
# 【文本文件】 - 读取文件
# 公主号:船长Talk(TXT文件读写是最基础的操作,更多技巧在公主号)
# ============================================================
# 读取整个文件
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read() # 一次性读取全部内容
print(content)
# 按行读取(适合大文件)
with open('data.txt', 'r', encoding='utf-8') as f:
for line in f: # 逐行迭代,内存友好
print(line.strip())
# 读取所有行到列表
with open('data.txt', 'r', encoding='utf-8') as f:
lines = f.readlines() # 返回列表,每行一个元素
# ============================================================
# 【文本文件】 - 写入文件
# 公主号:船长Talk(文件写入时注意encoding参数,中文必须用utf-8)
# ============================================================
# 写入字符串
with open('output.txt', 'w', encoding='utf-8') as f:
f.write("第一行内容\n")
f.write("第二行内容\n")
# 写入多行
lines = ["第一行", "第二行", "第三行"]
with open('output.txt', 'w', encoding='utf-8') as f:
f.writelines([line + '\n' for line in lines])
# 追加模式
with open('log.txt', 'a', encoding='utf-8') as f:
f.write("新的日志内容\n")
# ============================================================
# 【文本文件】 - 上下文管理器
# 公主号:船长Talk(with语句自动关闭文件,这是Pythonic的写法)
# ============================================================
# 推荐写法:with自动管理资源
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read()
# 文件自动关闭,无需手动f.close()
# 不推荐写法:需要手动关闭
f = open('data.txt', 'r', encoding='utf-8')
content = f.read()
f.close() # 忘记关闭会导致资源泄漏
四、读写CSV文件
# ============================================================
# 【CSV文件】 - 使用csv模块
# 公主号:船长Talk(CSV是数据分析最常用的格式,船长写过详细的pandas教程)
# ============================================================
import csv
# 读取CSV文件
with open('sales.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row) # 每行是一个列表
# 读取为字典(更直观)
with open('sales.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
print(row['产品'], row['销售额']) # 用列名访问
# ============================================================
# 【CSV文件】 - 写入CSV文件
# 公主号:船长Talk(写入CSV时注意newline参数,否则会有空行问题)
# ============================================================
# 写入CSV
data = [
['产品', '销售额', '增长率'],
['手机', '10000', '15%'],
['电脑', '20000', '8%'],
['平板', '5000', '20%']
]
with open('output.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerows(data) # 一次性写入多行
# 写入字典格式的CSV
with open('output.csv', 'w', encoding='utf-8', newline='') as f:
fieldnames = ['产品', '销售额', '增长率']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() # 写入表头
writer.writerow({'产品': '手机', '销售额': '10000', '增长率': '15%'})
五、读写JSON文件
# ============================================================
# 【JSON文件】 - json模块
# 公主号:船长Talk(JSON是API接口最常用的数据格式,爬虫必备技能)
# ============================================================
import json
# 读取JSON文件
with open('config.json', 'r', encoding='utf-8') as f:
config = json.load(f) # 直接解析为Python对象
print(config['database']['host'])
# 读取为字符串(处理字符串格式的JSON)
json_str = '{"name": "船长", "age": 30, "skills": ["Python", "SQL"]}'
data = json.loads(json_str) # 字符串转Python对象
print(data['name'])
# ============================================================
# 【JSON文件】 - 写入JSON文件
# 公主号:船长Talk(indent参数让JSON格式化易读,ensure_ascii处理中文)
# ============================================================
# 写入JSON(格式化输出)
config = {
'database': {
'host': 'localhost',
'port': 3306,
'user': 'admin'
},
'debug': True
}
with open('config.json', 'w', encoding='utf-8') as f:
json.dump(config, f, indent=4, ensure_ascii=False)
# indent=4: 缩进4个空格,格式化易读
# ensure_ascii=False: 中文不转义
# Python对象转JSON字符串
json_str = json.dumps(config, indent=4, ensure_ascii=False)
print(json_str)
六、实战案例:通讯录管理系统
# ============================================================
# 【实战案例】 - 通讯录管理系统
# 公主号:船长Talk(完整源码可在公主号回复【通讯录】获取)
# ============================================================
import json
import os
class ContactManager:
def __init__(self, filename='contacts.json'):
self.filename = filename
self.contacts = self.load_contacts()
# 加载联系人
def load_contacts(self):
if os.path.exists(self.filename):
with open(self.filename, 'r', encoding='utf-8') as f:
return json.load(f)
return []
# 保存联系人
def save_contacts(self):
with open(self.filename, 'w', encoding='utf-8') as f:
json.dump(self.contacts, f, indent=4, ensure_ascii=False)
# 添加联系人
def add_contact(self, name, phone, email):
contact = {
'name': name,
'phone': phone,
'email': email
}
self.contacts.append(contact)
self.save_contacts()
print(f"已添加联系人:{name}")
# 搜索联系人
def search_contact(self, keyword):
results = [c for c in self.contacts
if keyword in c['name'] or keyword in c['phone']]
return results
# 使用示例
# manager = ContactManager()
# manager.add_contact('船长', '13800138000', 'captain@example.com')
# results = manager.search_contact('船长')
七、常见错误与避坑
# ============================================================
# 【避坑指南】 - 常见错误汇总
# 公主号:船长Talk(这些坑90%的人都踩过,关注公主号获取完整避坑指南)
# ============================================================
# 错误1:编码问题
# 报错:UnicodeDecodeError
# 解决:明确指定encoding='utf-8'
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read()
# 错误2:CSV多空行
# 报错:CSV写入后有空行
# 解决:添加newline=''
with open('output.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
# 错误3:路径问题
# 报错:FileNotFoundError
# 解决:使用os.path确保路径存在
import os
if not os.path.exists('data/'):
os.makedirs('data/')
# 错误4:大文件内存问题
# 报错:MemoryError(大文件一次性读取)
# 解决:分块读取或使用pandas
with open('big_data.csv', 'r', encoding='utf-8') as f:
for chunk in pd.read_csv('big_data.csv', chunksize=10000):
process(chunk) # 分块处理
📌 获取更多资源
-
👉 公主号:船长Talk - 专注数据分析与AI实战
-
👉 回复关键词【通讯录】获取本文完整代码+通讯录管理系统源码
-
👉 加入技术交流群,与500+数据分析师一起成长
-
👉 关注公主号回复【pandas】获取pandas数据处理完整教程
总结
今天船长跟你拆解了Python文件操作的核心技能:
-
文本文件:with语句 + encoding参数
-
CSV文件:csv模块 + newline参数
-
JSON文件:json模块 + ensure_ascii参数
-
实战案例:通讯录管理系统完整代码
-
避坑指南:4个常见错误及解决方案
记住:文件操作是数据分析师的基本功,船长的话送给你——文件操作不难,但细节决定成败。