一、文件操作基础:打开、读写、关闭

操作文件的流程很固定,就像 “写信”:先打开信封(打开文件),再写入内容(写文件)或读取内容(读文件),最后封上信封(关闭文件)。

1. 打开文件:用 open () 函数

Python 用open()函数打开文件,语法是:

文件对象 = open(文件路径, 打开模式)
  • 文件路径:可以是 “相对路径”(相对于当前程序的位置)或 “绝对路径”(比如C:\data\test.txt);
  • 打开模式:决定文件能做什么(读、写、追加等),常用的有 3 种:
    • 'r':只读(默认模式,文件不存在会报错);
    • 'w':只写(文件不存在会创建,存在则清空原有内容);
    • 'a':追加(文件不存在会创建,新内容加在原有内容后面)。

示例:

# 打开当前文件夹下的test.txt,只读模式
f = open("test.txt", "r")

# 打开D盘data文件夹下的info.txt,写入模式(注意路径中的斜杠用/或\\)
f = open("D:/data/info.txt", "w")  # 推荐用/,避免转义问题

2. 关闭文件:用 close () 函数

打开文件后必须关闭,否则可能导致数据丢失或文件被占用。有两种方式关闭:

(1)手动关闭(用 close ())
f = open("test.txt", "w")
# 操作文件...
f.close()  # 必须关闭
(2)自动关闭(推荐!用 with 语句)

with语句会在操作完成后自动关闭文件,不用担心忘记close()

with open("test.txt", "w") as f:  # 用as给文件对象起别名f
    # 操作文件...(缩进部分)
    f.write("Hello, 文件操作!")  # 写入内容
# 离开with块后,文件自动关闭

强烈推荐用with语句,尤其是新手,能避免很多因 “忘记关闭文件” 导致的问题。

二、读写文本文件(.txt):最基础的文件操作

文本文件(.txt)是最常见的文件格式,适合存简单的文字数据(比如日志、备注)。

1. 写文件:用 write () 或 writelines ()

  • write(内容):写入单个字符串;
  • writelines(列表):写入多个字符串(列表中的元素)。
(1)覆盖写入('w' 模式)
# 写入单行内容
with open("note.txt", "w", encoding="utf-8") as f:  # 指定encoding="utf-8"避免中文乱码
    f.write("这是我的第一行笔记\n")  # \n表示换行
    f.write("今天学习了Python文件操作\n")

# 写入多行内容(用列表)
lines = ["第一行\n", "第二行\n", "第三行\n"]
with open("lines.txt", "w", encoding="utf-8") as f:
    f.writelines(lines)
  • 注意: 'w'模式会清空文件原有内容,所以如果只是想 “添加内容”,要用'a'模式。
(2)追加内容('a' 模式)
with open("note.txt", "a", encoding="utf-8") as f:  # 追加模式
    f.write("这是追加的内容,不会覆盖之前的文字\n")

运行后,note.txt的内容会变成:

这是我的第一行笔记
今天学习了Python文件操作
这是追加的内容,不会覆盖之前的文字

2. 读文件:用 read ()、readline () 或 readlines ()

根据需要读取的内容(全部、单行、多行),选择不同的方法:

(1)读全部内容(read ())
with open("note.txt", "r", encoding="utf-8") as f:
    content = f.read()  # 读取所有内容,返回一个字符串
    print("文件全部内容:")
    print(content)
(2)读一行内容(readline ())
with open("note.txt", "r", encoding="utf-8") as f:
    line1 = f.readline()  # 读第一行
    line2 = f.readline()  # 读第二行
    print("第一行:", line1)
    print("第二行:", line2)
(3)读所有行(readlines ())
with open("note.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()  # 读取所有行,返回列表(每行是一个元素)
    print("所有行:", lines)
    # 遍历列表打印
    for i, line in enumerate(lines, 1):
        print(f"第{i}行:{line}")

三、读写 CSV 文件(.csv):用表格格式存结构化数据

CSV 文件(逗号分隔值)是一种类似 Excel 的表格格式,适合存结构化数据(比如学生信息表、销售记录),比 txt 更规范,还能被 Excel 直接打开。

1. 用 Python 内置的 csv 模块操作 CSV

Python 自带csv模块,专门处理 CSV 文件,支持读写行、指定表头(列名)等。

(1)写入 CSV 文件(带表头)
import csv  # 导入csv模块

# 学生数据:列表套列表(每个子列表是一行数据)
students = [
    ["姓名", "年龄", "成绩"],  # 表头
    ["张三", 18, 85],
    ["李四", 19, 92],
    ["王五", 18, 78]
]

# 写入CSV
with open("students.csv", "w", encoding="utf-8", newline="") as f:
    # 创建csv写入对象
    writer = csv.writer(f)
    # 写入所有行(也可以用writerow()单行写入)
    writer.writerows(students)

print("CSV文件写入完成!")

运行后会生成students.csv,用 Excel 打开会显示:

姓名年龄成绩
张三1885
李四1992
王五1878
(2)读取 CSV 文件
import csv

with open("students.csv", "r", encoding="utf-8") as f:
    # 创建csv读取对象
    reader = csv.reader(f)
    # 遍历读取每一行
    for i, row in enumerate(reader):
        if i == 0:
            print("表头:", row)
        else:
            print(f"第{i}行数据:", row)

运行结果:

表头: ['姓名', '年龄', '成绩']
第1行数据: ['张三', '18', '85']
第2行数据: ['李四', '19', '92']
第3行数据: ['王五', '18', '78']

2. 用 pandas 读写 CSV(更简单,推荐)

如果处理大量 CSV 数据,用pandas库会更高效(需要先安装:pip install pandas)。

(1)写入 CSV(用 DataFrame)
import pandas as pd

# 创建DataFrame(类似表格)
data = {
    "姓名": ["张三", "李四", "王五"],
    "年龄": [18, 19, 18],
    "成绩": [85, 92, 78]
}
df = pd.DataFrame(data)

# 写入CSV(index=False表示不保存索引列)
df.to_csv("students_pd.csv", encoding="utf-8", index=False)
print("pandas写入CSV完成!")
(2)读取 CSV
import pandas as pd

# 读取CSV
df = pd.read_csv("students_pd.csv", encoding="utf-8")
print("读取的CSV数据:")
print(df)

# 可以直接获取某一列数据
print("\n所有学生的成绩:", df["成绩"].tolist())

运行结果:

读取的CSV数据:
   姓名  年龄  成绩
0  张三  18  85
1  李四  19  92
2  王五  18  78

所有学生的成绩: [85, 92, 78]

四、实战:学生信息管理系统(带文件存储)

综合文件操作和之前学的函数、字典,升级 “学生信息管理系统”,实现数据永久保存(用 CSV 文件存储)。

完整代码:

import csv

# 函数:加载学生数据(从CSV文件)
def load_students(filename):
    students = []
    try:
        with open(filename, "r", encoding="utf-8") as f:
            reader = csv.DictReader(f)  # 按字典方式读取(表头为键)
            for row in reader:
                # 转换数据类型(CSV读出来的都是字符串)
                student = {
                    "name": row["name"],
                    "age": int(row["age"]),
                    "score": float(row["score"])
                }
                students.append(student)
        print(f"已从{filename}加载{len(students)}条学生数据")
    except FileNotFoundError:
        print(f"{filename}不存在,将创建新文件")
    return students

# 函数:保存学生数据(到CSV文件)
def save_students(filename, students):
    with open(filename, "w", encoding="utf-8", newline="") as f:
        # 定义表头
        fieldnames = ["name", "age", "score"]
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()  # 写表头
        writer.writerows(students)  # 写所有行
    print(f"已将{len(students)}条学生数据保存到{filename}")

# 主程序
def main():
    filename = "students.csv"
    students = load_students(filename)  # 加载已有数据
    
    while True:
        print("\n=== 学生信息管理系统(带文件存储) ===")
        print("1. 添加学生")
        print("2. 显示所有学生")
        print("3. 保存并退出")
        
        choice = input("请选择操作:")
        
        if choice == "1":
            name = input("请输入姓名:")
            age = int(input("请输入年龄:"))
            score = float(input("请输入成绩:"))
            students.append({"name": name, "age": age, "score": score})
            print(f"已添加学生:{name}")
        
        elif choice == "2":
            if not students:
                print("暂无学生数据")
            else:
                print("所有学生信息:")
                for i, s in enumerate(students, 1):
                    print(f"{i}. 姓名:{s['name']},年龄:{s['age']},成绩:{s['score']}")
        
        elif choice == "3":
            save_students(filename, students)
            print("退出系统,再见!")
            break
        
        else:
            print("输入错误,请重新选择")

if __name__ == "__main__":
    main()

功能说明:

  1. 程序启动时,从students.csv加载已有数据(如果文件不存在,会创建新文件);
  2. 添加学生后,数据先存在内存的列表中;
  3. 选择 “保存并退出” 时,才会把所有数据写入 CSV 文件,实现永久保存;
  4. 下次启动程序,会自动读取上次保存的数据。

下一篇预告:异常处理与调试,让代码更 “健壮”

学会了文件操作,程序能 “记忆” 数据了,但还有一个问题:如果用户输入错误(比如输入文字却要求是数字)、文件被删除,程序会直接崩溃并报错。下一篇会带你学习 “异常处理”,让程序遇到错误时能友好提示并继续运行;还会教你简单的调试技巧,快速找到代码中的 bug。

如果这篇的文件操作案例对你有帮助,欢迎在评论区分享你的实践:比如你用文件存储了什么数据,或者遇到了哪些读写问题,我们一起解决~

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐