Python | 文件的基础操作

44 阅读5分钟
# ===================== 步骤1:写入文本到文件(文本模式) =====================
# 文本模式(w):写入字符串,必须指定encoding(避免中文乱码)
with open("./b.txt", mode="w", encoding="utf-8") as f:
    # 待写入的字符串(换行拼接,避免单行过长)
    write_str = "Nothing in the world is difficult " \
                "for one who sets his mind to it."
    # 写入文件并获取写入的字符数
    write_size = f.write(write_str)
    print(f"成功写入 {write_size} 个字符")  # 输出:成功写入 60 个字符

# ===================== 步骤2:读取文件+操作文件指针(文本模式) =====================
# 文本模式(r):读取字符串,指定encoding与写入时一致
with open("./b.txt", mode="r", encoding="utf-8") as f:
    # 1. 获取初始指针位置(文本模式初始为0,文件开头)
    init_pos = f.tell()
    print(f"初始文件指针位置:{init_pos}")  # 输出:初始文件指针位置:0

    # 2. 从当前位置读取2个字符
    read_2_char = f.read(2)
    print(f"读取的2个字符:{read_2_char}")  # 输出:读取的2个字符:No

    # 3. 文本模式下seek仅支持基准位置0(文件开头),调整指针到第7位
    # 错误提醒:文本模式下用seek(5,1)会报错,二进制模式才支持基准1/2
    target_pos = 7
    f.seek(target_pos, 0)  # 基准0:从文件开头偏移7个字符
    current_pos = f.tell()
    print(f"调整后指针位置:{current_pos}")  # 输出:调整后指针位置:7

    # 4. 读取指针位置后的剩余内容
    remain_content = f.read()
    print(f"指针位置{current_pos}后的内容:{remain_content}")
    # 输出:指针位置7后的内容:ing in the world is difficult for one who sets his mind to it.

# ===================== 步骤3:二进制模式操作文件(适配seek基准1/2) =====================
# 二进制模式(rb):操作字节流,禁止指定encoding参数
with open("./b.txt", mode="rb") as f:
    # 1. 读取2个字节(对应文本模式的2个字符,英文1字符=1字节)
    read_2_byte = f.read(2)
    print(f"二进制读取2个字节:{read_2_byte}")  # 输出:二进制读取2个字节:b'No'

    # 2. 二进制模式支持seek基准1(当前位置),向后偏移5个字节
    f.seek(5, 1)  # 当前位置是2 → 偏移后位置=2+5=7
    binary_pos = f.tell()
    print(f"二进制seek后指针位置:{binary_pos}")  # 输出:二进制seek后指针位置:7

    # 3. 字节流解码为字符串(需指定编码,与写入时一致)
    binary_content = f.read().decode("utf-8")
    print(f"二进制读取并解码后的内容:{binary_content}")
    # 输出:二进制读取并解码后的内容:ing in the world is difficult for one who sets his mind to it.
csv_file = open('iris.csv')
lines = []
for line in csv_file:
    line = line.replace('\n',"")
    lines.append(line.split(','))
print(lines)
csv_file.close()

学生管理系统,保存到text文件 新增load_students函数:程序启动时,从student.txt读取数据到students列表; 新增save_students函数:将students列表以 JSON 格式写入student.txt(JSON 格式易读且支持字典 / 列表); 操作后自动保存:在add_student、update_student、delete_student函数中,执行完操作后调用save_students,确保数据实时保存; 退出时再保存:退出系统(选项 6)时额外调用一次save_students,防止数据遗漏。

import json  # 用JSON格式保存数据(易读且方便解析)

students = []
FILE_PATH = "student.txt"  # 保存数据的文件


# 1. 加载本地文件中的学生数据(程序启动时执行)
def load_students():
    """从student.txt加载学生数据到students列表"""
    global students
    try:
        with open(FILE_PATH, "r", encoding="utf-8") as f:
            # 读取文件内容并转换为列表(JSON格式)
            students = json.load(f)
        print("已加载本地学生数据")
    except FileNotFoundError:
        # 文件不存在则创建空列表
        students = []
        print("本地无学生数据,已初始化空列表")


# 2. 保存students列表到student.txt文件
def save_students():
    """将students列表保存到student.txt"""
    with open(FILE_PATH, "w", encoding="utf-8") as f:
        # 把列表转换为JSON字符串写入文件
        json.dump(students, f, ensure_ascii=False, indent=2)
    print("学生数据已保存到本地")


# 3. 原菜单显示函数
def show_menu():
    """显示学生管理系统菜单"""
    print("--------------------------------------")
    print("|1. 添加学生信息")
    print("|2. 查询学生信息")
    print("|3. 查询学生总数")
    print("|4. 删除学生信息")
    print("|5. 修改学生信息")
    print("|6. 退出系统")
    print("--------------------------------------")


# 4. 添加学生(添加后自动保存)
def add_student():
    """添加"""
    name = input("输入学生姓名:")
    age = input("输入学生年龄:")
    grade = input("输入学生成绩:")
    student_id = int(input("输入学生ID:"))
    if student_id is None:
        student_id = len(students) + 1001
    student = {
        "name": name,
        "age": age,
        "grade": grade,
        "id": student_id
    }
    students.append(student)
    print(f"成功添加学生:{name}(id:{student_id})")
    save_students()  # 新增:添加后保存数据


# 5. 查询学生
def find_student(student_id):
    """查询"""
    for student in students:
        if student["id"] == student_id:
            print(student)
            return student
    return None


# 6. 查询学生总数
def count_student():
    """返回学生总数"""
    print(f"学生总数:{len(students)}")
    return len(students)


# 7. 获取用户选择
def get_select():
    choice = int(input("请输入您的选择:"))
    return choice


# 8. 修改学生(修改后自动保存)
def update_student():
    """修改学生信息"""
    student_id = int(input("输入要查询学生ID:"))
    student = find_student(student_id)
    if student:
        print("请输入新信息(回车不修改姓名)")
        new_name = input(f"姓名[{student['name']}]:") or student["name"]
        new_age = input(f"年龄[{student['age']}]:")
        new_grade = input(f"成绩[{student['grade']}]:")

        student["name"] = new_name
        if new_age:
            student["age"] = new_age
        if new_grade:
            student["grade"] = new_grade

        print(student)
        save_students()  # 新增:修改后保存数据
    else:
        print("没有学生信息")


# 9. 删除学生(删除后自动保存)
def delete_student():
    """删除学生信息"""
    student_id = int(input("输入要删除学生ID:"))
    for i, student in enumerate(students):
        if student["id"] == student_id:
            delete_name = student["name"]
            students.pop(i)
            print(f"已删除学生:{delete_name}")
            save_students()  # 新增:删除后保存数据
            return
    print("未找到该学生")


# 程序启动时先加载本地数据
load_students()

# 主循环
while True:
    show_menu()
    num = get_select()
    if num == 1:
        add_student()
    elif num == 2:
        student_id = int(input("输入要查询学生ID:"))
        find_student(student_id)
    elif num == 3:
        count_student()
    elif num == 4:
        delete_student()
    elif num == 5:
        update_student()
    elif num == 6:
        print("谢谢使用本系统")
        save_students()  # 退出时再保存一次(确保数据不丢失)
        break
    else:
        print("输入有误,重新输入1-6的数字")

效果:

image.png

image.png

image.png