Python文件操作完全指南:读写CSV/TXT/JSON(详细代码注释)

0 阅读5分钟

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个常见错误及解决方案

记住:文件操作是数据分析师的基本功,船长的话送给你——文件操作不难,但细节决定成败。