文件操作介绍

文件的作用:可以永久的保存数据

文件在硬盘中存储的格式是二进制

# 1. 打开文件 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True)
# file: 文件路径 文件名 文件对象
# mode: 打开方式 r(read): 只读 w(write): 只写 a(append): 追加打开
# buffering: 缓冲区大小 0: 不缓冲 1: 行缓冲 -1: 系统默认缓冲区大小
# encoding: 编码格式 一种是gbk 一种是utf-8
# 返回值: 文件对象后续所有的文件,都需要通过文件对象来操作
f = open('1.txt', 'r', encoding='utf-8')
# 2. 读取文件内容
buf = f.read()
print(buf)
# 3. 关闭文件
f.close()

文件的写操作

# 1. 打开文件 w方式打开文件,如果文件不存在会创建文件,如果文件存在会清空文件
f = open('a.txt', 'w', encoding='utf-8')  # 这里不设置utf-8中文会乱码
# 写入文件
f.write('hello world!\n') # 写入字符串 换行需要加\n
f.write('world hello!\n')
f.write('你好,中国!\n')  
# 关闭文件
f.close()


# a 追加方式打开文件,追加内容,在文件末尾追加内容
# 注意:不管是a 方式打开文件,还是w方式打开文件,写内容都是用write方法
f = open('b.txt', 'a', encoding='utf-8')
f.write('hello world!\n')
f.write('world hello!\n')
f.write('你好,中国!\n')
f.close()

文件的读操作-read

# 1. 打开文件
f = open('a.txt', 'r', encoding='utf-8')
# 2. 读取文件 文件对象.read(n) n表示读取的字符个数 如果不写n表示读取所有的内容
content = f.read(3)
print(content)
content = f.read(3)
print(content)
# 3. 关闭文件
f.close()

按行读取文件

# 1. 打开文件
f = open('a.txt', 'r', encoding='utf-8')
# 2. 读取文件 readline() 一次读取一行的内容 返回值是字符串
content = f.readline()
print(content)
# 3. 关闭文件
f.close()

# 1. 打开文件
f = open('a.txt', 'r', encoding='utf-8')
# 2. 读取文件 readlines() 读取所有行的内容,返回一个列表,每一行的内容是列表的一个元素
content = f.readlines()
print(content)
# 3. 关闭文件
f.close()

# 1. 打开文件
f = open('a.txt', 'r', encoding='utf-8')
# 2. 读取文件 readlines() 读取所有行的内容,返回一个列表,每一行的内容是列表的一个元素
content = f.readlines()
# 列表推导式 去掉每一行的空格
content = [i.strip() for i in content]
print(content)

# 3. 关闭文件
f.close()

模拟拷贝大文件

# 文件操作
f = open('a.txt', 'r', encoding='utf-8')
# 读取文件
while True:
    content = f.readline()
    if len(content) == 0:
        break
    print(content, end='')

# 关闭文件
f.close()

# 文件操作 不换行的大文件

list1 = []
f = open('1.txt', 'r', encoding='utf-8')

while True:
    content = f.read(3) # f.read(5)
    if content:
        print(content)
        list1.append(content) # 组成列表
        print(list1)
    else:
        break

f.close()

补充:计算机中的大小

# 计算机只认识0和1
# 进制:
    # 二进制,只有 0 和 1 组成,缝二进一
  # 十进制, 0 1 2 3 4 5 6 7 8 9,缝十进一
  # 十六进制, 0 1 2 3 4 5 6 7 8 9 A B C D E F 缝十六进一
# 计算机最小的单位是bit(位),只有两个数据值 0 和 1
# 字节:是计算机中的基本的存储单位 byte
    # 1 byte = 8 bit

# 1kB = 1024 byte
# 1MB = 1024 KB
# 1GB = 1024 MB
# 1TB = 1024GB

# 宽带计算 100Mbits 200Mbits
#                    12.5M/s   25M/s

文件打开模式

文本文件:txt,py,.md能够使用记事本打开文件

二进制文件:具有特殊格式的文件,MP3 MP4 rmvb avi png jpg

文本文件可以使用 文本的方式打开文件,也可以是用二进制的方式打开文件

二进制文件,只能使用二进制的方式打开文件

二进制打开的方式 不管读取还是书写 都需要使用而进取数据 rb wb ab

注意点:不能使用 encoding 参数

访问模式 说明
r 以只读方式打开文件。文件的指针将会放在文件的开头,这是默认模式。
w 打开一个文件只用于写入。如果改文件已经存在则将其覆盖。如果该文件不存在,创建新文件
a 打开一个文件用于追加,如果该文件已经存在,文件指针将会放在文件的结尾。也就是说,新的内容会被写入到已有的内容之后。如果该文件不存在,创建新文件进行写入
rb 以二进制格式打开一个文件用于只读,文件指针将会放到文件的开头,这是默认模式
wb 以二进制格式打开一个文件用于写入,如果该文件已经存在则将其覆盖,如果该文件不存在,创建新文件
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r+ 打开一个文件用于读写,文件指针会放在文件的开头
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
f = open('test.txt', 'wb')
f.write('你好,中国'.encode())
f.close()

f = open('test.txt', 'rb')
content = f.read()
print(content)
print(content.decode())
f.close()

应用-文件备份

# 文件备份
# 1. 读取源文件的内容
f = open('a.txt', 'rb')
# 2. 读取源文件的内容
content = f.read()
# 3.关闭源文件
f.close()
# 用只写的方式打开目标文件
f_w = open('a[备份].txt', 'wb')
# 把源文件的内容写入到目标文件
f_w.write(content)
# 关闭目标文件
f_w.close()

# 代码优化:
# 1. 如果文件比较大,循环读取文件
# 2. 复制备份的文件可能是 txt 文件,可能是二进制文件,--->  使用二进制方式打开文件

file_name = input('请输入要备份的文件名:')
# 文件备份
# 1. 读取源文件的内容
f = open(file_name, 'rb')
# 2. 读取源文件的内容
content = f.read()
# 3.关闭源文件
f.close()

# 根据原文件名,找到文件的后缀和文件名
index = file_name.rfind('.')
# 新文件名
new_file_name = file_name[:index] + '[备份]' + file_name[index:]
# 用只写的方式打开目标文件
f_w = open(new_file_name, 'wb')
# 把源文件的内容写入到目标文件
f_w.write(content)
# 关闭目标文件
f_w.close()

文件和目录的操作

# 文件和文件夹操作 需要导入os模块
import os

# 1.文件重命名 os.rename(原文件名, 新文件名)
os.rename('test.txt', 'test1.txt')

# 2.删除文件 os.remove(文件名)
os.remove('test1.txt')

# 3.创建文件夹 os.mkdir(文件夹名)
os.mkdir('test')

# 4.删除文件夹 os.rmdir(文件夹名) 只能删除空文件夹
os.rmdir('test')

# 5.获取当前目录 os.getcwd() get current work directory
print(os.getcwd())

# 6.改变默认目录 os.chdir(目录名) change directory
os.chdir('test')

# 7.获取目录列表 os.listdir(目录名)
print(os.listdir(os.getcwd()))

应用批量修改文件

# 在test目录创建十个文件
def create_file():
     for i in range(10):
         file_name = 'test/file_' + str(i) + '.txt'
         print(file_name)
         f = open(file_name, 'w')
         f.close()


create_file()

# 这是先切换目录在创建文件
def create_file_1():
    os.chdir('test')
    for i in range(10):
        file_name = 'file_' + str(i) + '.txt'
        print(file_name)
        f = open(file_name, 'w')
        f.close()
    os.chdir('../')  # 返回上一级目录


create_file_1()


# 修改文件
def modify_filename():
    os.chdir('test')
    buf_list = os.listdir()
    for file_name in buf_list:
        new_file = 'new_' + file_name
        os.rename(file_name, new_file)
    os.chdir('../')


modify_filename()

学生管理系统保存功能

# 学生信息管理系统-文件版
# {'name': 'Tom', 'age': 18, 'gender': '男', 'class': 'Python'}
# [{}]
# 需要将学生信息存储到文件中


# 增删改查操作
# 存储学生信息:姓名,年龄,班级,性别
# 存储所有学生信息:列表 [{}, {}, {}]


stu_list = []  # 存储所有学生信息


def show_menu():  # 显示菜单
    print("1. 添加学生信息")
    print("2. 删除学生信息")
    print("3. 修改学生信息")
    print("4. 查询学生信息")
    print("5. 显示所有学生信息")
    print("6. 退出系统")
    print("-" * 20)


def insert_student():  # 输入学生信息
    name = input("请输入姓名:")
    age = input("请输入年龄:")
    gender = input("请输入性别:")
    class_name = input("请输入班级:")

    # 判断是否有重复的学生信息
    for stu_dict in stu_list:
        if stu_dict["name"] == name:
            print("学生信息已存在!")
            return

    stu_dict = {"name": name, "age": age, "gender": gender, "class": class_name}
    stu_list.append(stu_dict)
    print("添加成功!")


def show_all_student():  # 显示所有学生信息
    if len(stu_list) == 0:
        print("没有学生信息")
        return
    for stu_dict in stu_list:
        # print("姓名:%s,年龄:%s,性别:%s,班级:%s" % (stu_dict["name"], stu_dict["age"], stu_dict["gender"], stu_dict["class"]))
        print("姓名:{name},年龄:{age},性别:{gender},班级:{class}".format(**stu_dict))


# 保存学生信息到文件
def save_student():
    f = open("student.txt", "w", encoding="utf-8")
    f.write(str(stu_list))
    f.close()


# 删除学生信息
def delete_student():
    name = input("请输入要删除的学生姓名:")
    for stu_dict in stu_list:
        if stu_dict["name"] == name:
            stu_list.remove(stu_dict)
            print("删除成功!")
            return
    print("未找到该学生信息!")


# 修改学生信息
def modify_student():
    name = input("请输入要修改的学生姓名:")
    for stu_dict in stu_list:
        if stu_dict["name"] == name:
            age = input("请输入年龄:")
            gender = input("请输入性别:")
            class_name = input("请输入班级:")
            stu_dict["age"] = age
            stu_dict["gender"] = gender
            stu_dict["class"] = class_name
            print("修改成功!")
            return
    print("未找到该学生信息!")


# 查询学生信息
def search_student():
    name = input("请输入要查询的学生姓名:")
    for stu_dict in stu_list:
        if stu_dict["name"] == name:
            print("姓名:{name},年龄:{age},性别:{gender},班级:{class}".format(**stu_dict))
            return
    print("未找到该学生信息!")


while True:
    show_menu()
    option = input("请选择操作:")
    if option == "1":
        insert_student()
    elif option == "2":
        delete_student()
    elif option == "3":
        modify_student()
    elif option == "4":
        search_student()
    elif option == "5":
        show_all_student()
    elif option == "6":
        print("退出系统")
        save_student()
        break
    else:
        print("输入有误,请重新输入!")
    print("-" * 20)

results matching ""

    No results matching ""