文件操作介绍
文件的作用:可以永久的保存数据
文件在硬盘中存储的格式是二进制
# 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)