1、文件的介绍
文件:就是以硬盘为载体,存储计算机所产生的数据
学习文件的目的:把程序中所产生的数据保存到文件,能够让数据永久存储
永久存储的方式:
- 文件
- 数据库,读写性能非常快,效率更高
2、文件的读取
文件的读取方式为:
r
模式:以字符串的方式读取文件中的数据rb
模式:以二进制(字节)的方式读取文件中的数据
r 模式
# 第一步:打开文件
file = open("test.txt", "r", encoding="utf-8")
# 查看打开文件使用的编码格式
# cp936 => gbk
print(file.encoding)
# 第二步:读取文件中的数据
result = file.read() # 读取文件中的所有数据
print(result, type(result))
# 第三步: 关闭文件
file.close()
运行结果:
utf-8
人生苦短,我用python!
人生苦短,我用python!
人生苦短,我用python!
<class 'str'>
r模式的注意点
- 要打开的文件必须存在,否则就崩溃
- 打开文件默认是在当前工程目录下面,如果打开的文件没有在当前工程里面,需要加上文件的路径
- 在
window
的python
解释器下面,打开文件默认使用的是gbk
编码,mac
或者Linux
的python
解释器,打开文件默认是utf-8
- 在
rb 模式 — 以二进制(字节)的方式读取文件中的数据
比如:视频,图片,音频等数据需要使用
rb
模式读取文件中的数据
打开一张图片:
# # 第一步:打开文件
file = open("11.png", "rb")
# # 第二步:读取文件中的数据
result = file.read()
print(result, type(result))
# # 第三步:关闭文件
file.close()
运行结果是一行特别长的二进制代码,我简化一下展示:
b'\xe4\xba\xba\xa8python!\r\n' <class 'bytes'>
注意:数据前带b
表示字节数据或者二进制数据
rb
模式读取文本文件中的数据:
# 第一步:打开文件
file = open("test.txt", "rb")
# 第二步:读取文件中的数据
result = file.read()
print(result, type(result))
# 需要对二进制数据进行解码,转成字符串数据
content = result.decode("utf-8")
print(content, type(content))
# 第三步:关闭文件
file.close()
运行结果:
b'\xe4\xba\xba\xe7\x94\x9f\xa8python!\r\n' <class 'bytes'>
人生苦短,我用python!
人生苦短,我用python!
人生苦短,我用python!
<class 'str'>
3、文件的写入
向文件写入数据的操作为:
-
w
模式: 以字符串的方式写入数据
-
-
wb
模式: 以二进制(字节)的方式写入数据
-
w模式
# 第一步:打开文件
file = open("2.txt", "w", encoding="utf-8")
# 查看打开文件,操作文件的编码格式
print(file.encoding)
# 第二步: 向文件中写入数据(字符串)
file.write("hello\n")
file.write("world\n")
file.write("哈哈")
# 第三步: 关闭文件
file.close()
w模式的注意点:
- 当打开的文件不存在时,默认会创建一个指定的文件
- 当打开的文件存在时,先把原文件中的所有数据清空,然后再写入指定的数据
wb模式 — 以二进制(字节)的方式写入数据
# 第一步:打开文件
file = open("2.txt", "wb")
# 第二步: 向文件中写入数据(字符串)
content = "哈哈"
# 把字符串编码成二进制(字节)也就是把字符串转成二进制
content_data = content.encode("utf-8")
file.write(content_data)
# 第三步: 关闭文件
file.close()
4、文件的追加写入
- a模式: 以字符串的方式追加写入数据
- ab模式: 以二进制(字节)的方式追加写入数据
a模式 — 以字符串的方式追加写入数据
# 第一步:打开文件
file = open("3.txt", "a", encoding="utf-8")
# 第二步: 追加写入数据(字符串数据)
file.write("嘻嘻")
# 第三步: 关闭文件
file.close()
a模式的注意点:
- 当打开的文件不存在时,那么默认会创建一个指定的文件
- 当打开的文件存在时,原文件中的数据会进行保留,在原文件数据的末尾追加写入指定的数据
ab模式 - 以二进制(字节)的方式追加写入数据
# 第一步:打开文件
file = open("3.txt", "ab")
# 第二步: 追加写入数据(二进制数据)
content = "哈哈"
# 对字符串进行编码,把字符串转成二进制数据(字节数据)
data = content.encode("utf-8")
print(type(data))
file.write(data)
# 第三步: 关闭文件
file.close()
5、文件读取数据的其他常用方法
- read方法,需要指定参数
- readline方法:读取一行数据
- readlines方法:读取所有行数据
read方法带有参数的使用
read(数据长度):如果文件的操作模式是r模式,这里的数据长度是字符串的数据长度
file = open("test.txt", "r", encoding="utf-8")
#6:表示读取6个字符串数据的长度
result = file.read(6)
print(result)
file.close()
运行结果:
人生苦短,我
read(数据长度):如果文件的操作模式是rb模式,这里的数据长度是字节的数据长度。
提示:在utf-8编码格式下,一个汉字占用三个字节,一个字母,数字占用1个字节
file = open("test.txt", "rb")
### 3:表示读取3个字节数据的长度
# 提示:在utf-8编码格式下,一个汉字占用三个字节,一个字母,数字占用1个字节
result = file.read(3)
print(result)
# 对二进制数据进行解码转成字符串
content = result.decode("utf-8")
print(content)
result = file.read(3)
print(result)
# 对二进制数据进行解码转成字符串
content = result.decode("utf-8")
print(content)
file.close()
运行结果:
b'\xe4\xba\xba'
人
b'\xe7\x94\x9f'
生
readlines方法:读取所有行数据
file = open("test.txt", "r", encoding="utf-8")
# 读取文件中的所有行数据
result = file.readlines()
print(result, type(result))
for row in result:
print(row)
file.close()
运行结果:
['人生苦短,我用python!\n', '人生苦短,我用python!\n', '人生苦短,我用python!\n'] <class 'list'>
人生苦短,我用python!
人生苦短,我用python!
人生苦短,我用python!
readline方法:读取一行数据
file = open("test.txt", "r", encoding="utf-8")
# 读取文件中的一行数据
result = file.readline()
print(result, type(result))
for row in result:
print(row)
file.close()
运行结果:
人生苦短,我用python!
<class 'str'>
人
生
苦
短
,
我
用
p
y
t
h
o
n
!
with语句的使用
文件使用完后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的,文件在读写时都有可能产生IOError
,一旦出错,后面的f.close()
就不会调用。Python提供了 with 语句的这种写法,既简单又安全,并且 with 语句执行完成以后自动调用关闭文件操作,即使出现异常也会自动调用关闭文件操作。
with 语句的示例代码:
# 1.以写的方式打开文件
with open("1.txt", "w") as f:
# 2.读取文件内容
f.write("hello world")
6、文件的拷贝
我们想把原文件test.txt
拷贝一份为test[复件].txt
:
# 原文件的名字
src_file_name = "test.txt"
# 根据点把原文件的名字分割成三部分
file_name, point, end_str = src_file_name.partition(".")
# 生成目标文件的名字 test[复件].txt
dst_file_name = file_name + "[复件]" + point + end_str
print(dst_file_name)
# 1. 打开目标文件(拷贝后的文件 test[复件].txt)
dst_file = open(dst_file_name, "wb")
# 2. 打开原文件,读取原文件中的数据
src_file = open(src_file_name, "rb")
# 读取原文件中的所有二进制数据
src_file_data = src_file.read()
# 3. 把读取到的原文件数据写入到目标文件(拷贝后的文件 test[复件].txt)
dst_file.write(src_file_data)
# 4. 把文件关闭
src_file.close()
dst_file.close()
大文件拷贝
# 原文件的名字
src_file_name = "test.txt"
# 根据点把原文件的名字分割成三部分
file_name, point, end_str = src_file_name.partition(".")
# 生成目标文件的名字 test[复件].txt
dst_file_name = file_name + "[复件]" + point + end_str
print(dst_file_name)
# 1. 打开目标文件(拷贝后的文件 test[复件].txt)
dst_file = open(dst_file_name, "wb")
# 2. 打开原文件,读取原文件中的数据
src_file = open(src_file_name, "rb")
while True:
# 读取原文件中的所有二进制数据
src_file_data = src_file.read(1024) # 每次读取最大字节数是1024
# if len(src_file_data) > 0:
# if 判断的简写
if src_file_data:
# 3. 把读取到的原文件数据写入到目标文件(拷贝后的文件 test[复件].txt)
dst_file.write(src_file_data)
else:
print("文件拷贝完毕")
# 提示:如果读取到数据长度是0表示文件读取完成
break
# 4. 把文件关闭
src_file.close()
dst_file.close()
if 判断的扩展
- if语句结合 bool 类型
- if语句结合容器类型
- if语句结合非零即真
- if语句结合 None
if语句结合 bool 类型
if False:
print("ok")
else:
print("error")
运行结果:
error
if语句结合容器类型
说明:如果
if
语句结合容器类型使用,容器类型里面有数据表示条件成立,否则容器类型里面没有数据表示条件失败
容器类型:字符串,列表,元组,字典,集合,range, 二进制
if语句结合字符串:
my_value = "b"
if my_value:
print("ok")
else:
print("error")
################ 运行结果 ################
ok
if语句结合range:
my_range = range(0)
if my_range:
print("ok")
else:
print("error")
################ 运行结果 ################
error
if语句结合集合:
my_set = set()
if my_set:
print("ok")
else:
print("error")
################ 运行结果 ################
error
if语句结合列表:
my_list = [1,3,5]
if my_list:
print("ok")
else:
print("error")
################ 运行结果 ################
ok
7、文件和文件夹的相关操作
操作文件和文件夹的模块:
import os
文件和文件夹操作的高级模块:
import shutil
创建空的文件
file = open("abcd.txt", "wb")
file.close()
重命名
import os
###将abcd.txt文件重命名为aaa.txt
os.rename("abcd.txt", "aaa.txt")
删除文件
import os
os.remove("1.txt")
创建文件夹
import os
os.mkdir("AAA")
查看当前操作目录的路径
import os
path = os.getcwd()
print(path)
切换目录
import os
os.chdir("AAA")
path = os.getcwd()
print(path)
切换到上一级路径
import os
os.chdir("..")
path = os.getcwd()
print(path)
删除文件
import os
os.remove("AAA/abcd.txt")
删除非空文件夹
import os
os.rmdir("CCC")
删除空目录
import os
os.rmdir("BBB")
删除非空目录
import shutil
shutil.rmtree("CCC")
查看目录下的所有文件名
import os
# 默认查看当前目录下的所有文件名
result = os.listdir() #等价于 result = os.listdir(".")
print(result)
查看指定目录下的所有文件名
import os
result = os.listdir("CCC")
print(result)
判断指定文件是否存在
import os
result = os.path.exists("4.txt")
print(result)
判断指定文件夹是否存在
import os
result = os.path.exists("AA")
print(result)
获取指定文件的文件名和文件的后缀
import os
file_name, end_str = os.path.splitext("3.txt")
print(file_name, end_str)
判断是否是文件
import os
result = os.path.isfile("DD")
print(result)
判断是否是文件夹
import os
result = os.path.isdir("3.txt")
print(result)
批量修改文件名
我们把
test
目录下的所有文件名前面都加上一个[黑马出品]-
:
import os
# 1. 获取指定目录下的所有文件名
file_name_list = os.listdir("test")
print(file_name_list)
# 切换到test目录里面
path = os.getcwd()
print(path)
os.chdir("test")
path = os.getcwd()
print(path)
# 2. 遍历文件名列表获取每一个文件名,然后依次对文件进行重命名
for file_name in file_name_list:
# 生成重命名后的文件名
rename_file_name = "[黑马出品]-" + file_name
print(file_name, rename_file_name)
# 使用rename函数进行重命名
os.rename(file_name, rename_file_name)
学生管理系统文件版
# 学生管理系统的分析:
# 1. 每个学生的信息使用字典进行存储
# 2. 对于学生管理系统,是需要管理不同学生的,所以学生管理系统里面需要在定义列表,使用列表管理不同的学生字典信息
import os
# 定义全局变量的学生列表
student_list = []
# 显示学生管理系统的功能菜单
def show_menu():
print("--------------学生管理系统V1.0------------")
print("1. 添加学生")
print("2. 修改学生")
print("3. 删除学生")
print("4. 查询学生")
print("5. 显示所有学生")
print("6. 退出")
# 添加学生
def add_student():
name = input("请输入学生的姓名:")
age = input("请输入学生的年龄:")
sex = input("请输入学生的性别:")
# 使用字典存储每个学生的信息
student_dict = {}
# 添加键值对
student_dict["name"] = name
student_dict["age"] = age
student_dict["sex"] = sex
# 把学生字典添加到学生列表里面
student_list.append(student_dict)
print("添加成功")
# 显示所有学生的信息
def show_all_students():
# 遍历学生列表,显示每一个学生信息
for index, student_dict in enumerate(student_list):
# 学号 = 下标 + 1
student_no = index + 1
print("学号: %d 姓名: %s 年龄: %s 性别: %s" % (student_no,
student_dict["name"],
student_dict["age"],
student_dict["sex"]))
# 修改学生信息
def modify_student():
# 接收用户输入学生的学号
student_no = int(input("请输入您要修改学生的学号:"))
# 计算学生列表的下标 = 学号 - 1
index = student_no - 1
# 判断下标的范围是否是一个合法的范围
if index >= 0 and index < len(student_list):
# 根据下标获取对应的学生字典信息
student_dict = student_list[index]
# 重新接收用户输入的学生信息
new_name = input("请输入修改后学生的姓名:")
new_age = input("请输入修改后学生的年龄:")
new_sex = input("请输入修改后学生的性别:")
# 修改字典信息
student_dict["name"] = new_name
student_dict["age"] = new_age
student_dict["sex"] = new_sex
print("修改成功")
else:
print("请输入合法的学号!")
# 删除学生信息
def remove_student():
# 接收用户输入学号
student_no = int(input("请输入要删除学生的学号:"))
# 根据学号计算学生的下标
index = student_no - 1
# 判断下标的范围是否是一个合法的范围
if index >= 0 and index < len(student_list):
# 根据下标删除对应的学生信息
del student_list[index]
print("删除成功")
else:
print("请输入合法的学号!")
# 查询学生
def query_student():
# 接收用户输入的学生姓名
name = input("请输入要查询学生的姓名:")
# 遍历列表获取每一个学生字典信息
for index, student_dict in enumerate(student_list):
if student_dict["name"] == name:
# 生成学生的学号
student_no = index + 1
# 代码执行到此,说明找到了学生信息
print("学号: %d 姓名: %s 年龄: %s 性别: %s" % (student_no,
student_dict["name"],
student_dict["age"],
student_dict["sex"]))
break
else:
print("对不起,您查找的学生信息不存在!")
# 保存列表数据到文件
def save_data():
# 1. 打开文件
file = open("student_list.data", "w", encoding="utf-8")
# 2. 把列表数据转成字符串保存到文件
student_list_str = str(student_list)
print(student_list_str, type(student_list_str))
file.write(student_list_str)
# 3. 关闭文件
file.close()
# 加载缓存文件中的数据
def load_data():
# 1. 判断缓存文件是否存在
if os.path.exists("student_list.data"):
# 2. 如果缓存文件存在,读取文件中的数据
file = open("student_list.data", "r", encoding="utf-8")
file_data = file.read()
# 3. 把读取到数据给全局变量(student_list)
# "[{'name': '李四', 'age': '20', 'sex': '男'}, {'name': '王五', 'age': '20', 'sex': '男'}]"
# 如果字符串列表转成列表
new_student_list = eval(file_data)
# 把读取到列表中的每一个数据添加到全局变量列表里面
student_list.extend(new_student_list)
# 程序的入口函数,程序第一个要执行的函数
def start():
# 程序启动后,加载文件中的数据只加载一次即可
load_data()
while True:
# 显示学生管理系统的功能菜单
show_menu()
# 接收用户输入的功能选项
menu_option = input("请输入您需要的功能选项:")
# 判断功能选项
if menu_option == "1":
print("添加学生")
add_student()
elif menu_option == "2":
print("修改学生")
modify_student()
elif menu_option == "3":
print("删除学生")
remove_student()
elif menu_option == "4":
print("查询学生")
query_student()
elif menu_option == "5":
print("显示所有学生")
show_all_students()
elif menu_option == "6":
print("退出")
# 把列表数据保存到文件,可以做到永久存储
save_data()
break
# 启动学生管理系统
start()
# 快捷键:ctr + - 把函数的代码折叠起来, ctr + + 把函数的代码展开
# 快捷键:ctr + shift + - 把所有函数的代码折叠起来, ctr + shift + + 把所有函数的代码展开