7.1 文件操作介绍
- 使用文件的目的:就是把一些存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力
7.2 文件的打开和关闭
f = open('test.txt', 'w')
f.close()
7.3 文件的读写
f = open('test.txt', 'w')
f.write('hello world, i am here!')
f.close()
f = open('test.txt', 'r')
content = f.read(5) # 最多读取5个数据
print(content)
print("-"*30) # 分割线,用来测试
content = f.read() # 从上次读取的位置继续读取剩下的所有的数据
print(content)
f.close() # 关闭文件,这个可以是个好习惯哦
结果
hello
------------------------------
world, i am here!
f = open('test.txt', 'r')
content = f.readline()
print("1:%s" % content)
content = f.readline()
print("2:%s" % content)
f.close()
7.4 应用1 制作文件的备份
# 提示输入文件
oldFileName = input("请输入要拷贝的文件名字:")
# 以读的方式打开文件
oldFile = open(oldFileName,'rb')
# 提取文件的后缀
fileFlagNum = oldFileName.rfind('.')
if fileFlagNum > 0:
fileFlag = oldFileName[fileFlagNum:]
# 组织新的文件名字
newFileName = oldFileName[:fileFlagNum] + '[复件]' + fileFlag
# 创建新文件
newFile = open(newFileName, 'wb')
# 把旧文件中的数据,一行一行的进行复制到新文件中
for lineContent in oldFile.readlines():
newFile.write(lineContent)
# 关闭文件
oldFile.close()
newFile.close()
7.5文件和文件夹的相关操作
- 文件重命名 os.rename()
- 删除文件 os.remove()
- 创建文件夹 os.mkdir()
- 获取当前目录 os.getcwd()
- 改变目录 os.chdir()
- 获取目录列表 os.listdir()
- 删除文件夹 os.rmdir()
- 判断某文件在不在 os.path.exits()
7.6 应用:批量修改文件名
7.7 应用:批量复制文件
def main():
'''
这个函数只能复制里面没有文件夹的文件夹里面的文件,输入的文件夹名时请输入绝对路径
'''
import os
directory = input('请输入需要拷贝的文件夹(如D:\\xiazai\\study\\英语学习)')
os.chdir(directory) # 从当前路径转换到文件夹所在路径
# print(os.getcwd())
# print(os.listdir())
for i in os.listdir(): # 获取到的当前的文件夹下的文件是一个list
new_file_name = i[:i.rindex('.')] + '_backup' + i[i.rindex('.'):] # 新文件名
old_f = open(i, 'rb')
new_f = open(new_file_name, 'wb')
while True: # 1M 1M的copy
data = old_f.read(1021*1024)
if len(data) > 0:
new_f.write(data)
else:
break
old_f.close()
new_f.close()
main()
7.8 综合应用:学生管理系统(文件版)
"""
{"name": '诸葛亮', "age": 40, "sex": "男"}
[{"name": '诸葛亮', "age": 40, "sex": "男"}, {"name": '刘备', "age": 45, "sex": "男"}]
思路:
1、把添加过的数据保存在一个文件中(保存的格式为列表:[{"name": '诸葛亮', "age": 40, "sex": "男"}, {"name": '刘备', "age": 45, "sex": "男"}])
2、每一次运行,先读取文件中的名片数据(列表),把数据赋值给info_list,这个步骤称为加载数据
3、操作完文件之后,要退出系统之前,要保存数据(把info_list重新写入到文件中)
注意: 实际上,我们修改、删除、添加数据都是对变量info_list进行操作,而不是文件
"""
import sys
import os
info_list = [] # 这个列表用来保存所有的名片,它里面每一个元素就是每一个小名片(列表)
user_name = "admin"
password = "123456"
file_name = "info.txt"
def load_info():
"""加载数据: 读取文件中的名片数据,把数据赋值给info_list"""
global info_list
f = open(file_name, "r", encoding="utf-8")
info_list = eval(f.read()) # 读取到的数据类型是字符串, 读取到的数据是“[{"name": '诸葛亮', "age": 40, "sex": "男"}]”
f.close()
def save_info():
"""退出系统之前,要保存数据(把info_list重新写入到文件中)"""
f = open(file_name, "w", encoding="utf-8")
f.write(str(info_list)) # write的参数建议是字符串,不能是列表
f.close()
def welcome():
"""
打印界面
"""
print("-" * 30)
print("--------名片管理器v1.0--------")
print("----1、添加名片")
print("----2、删除名片")
print("----3、修改名片")
print("----4、查询名片")
print("----5、查询所有名片")
print("----6、退出系统")
print("-" * 30)
def add_info():
"""添加名片功能的函数"""
name = input("请输入姓名:")
age = input("请输入年龄:")
sex = input("请输入性别:")
dic = {"name": name, "age": age, "sex": sex}
info_list.append(dic) # 把name, age, sex整合成一个小列表,追加到大列表info_list中
print("【INFO】:添加成功!")
print(info_list) # 自己测试用,看看有没有添加成功
def del_info():
"""删除名片功能的函数"""
name = input("请输入要删除这个名片的姓名:")
for i in info_list: # i就是每一个小列表
if name in i.values(): # 判断名字在不在小列表中
# 在,才执行这里的代码,就删除
# 在大列表中删除小列表
info_list.remove(i)
print("【INFO】:删除成功!")
print(info_list)
break # 如果找到第一个成功了,后面不用再找了
else:
print("【ERROR】:删除不成功,查无此人!")
def modify_info():
name = input("请输入要修改这个名片的姓名:")
for i in info_list: # i就是每一个小列表
if name in i.values(): # 判断名字在不在小列表中
# 在,才执行这里的代码,就修改
new_name = input("请输入新的姓名:")
new_age = input("请输入新的年龄:")
new_sex = input("请输入新的性别:")
# 如果在列表中修改数据?通过下标来修改:列表名[下标] = 值
info_list[info_list.index(i)] = {"name": new_name, "age": new_age, "sex": new_sex}
print("【INFO】:修改成功!")
print(info_list)
break # 如果找到第一个成功了,后面不用再找了
else:
print("【ERROR】:删除不成功,查无此人!")
def search_info():
name = input("请输入要查询的名片的姓名:")
for i in info_list: # i就是每一个小列表
if name in i.values(): # 判断名字在不在小列表中
print("【INFO】:这个人的信息如下:%s" % i)
break # 如果找到第一个成功了,后面不用再找了
else:
print("【ERROR】:删除不成功,查无此人!")
def search_all_info():
uname = input("请输入管理员账号:")
pwd = input("请输入管理员密码:")
if uname == user_name and pwd == password:
# 展示所有数据
# [['诸葛亮', '40', '男'], ['刘备', '45', '男']]
print(info_list)
# for i in info_list:
# # print(i)
# for j in i:
# print(j, end="\t")
# print()
else:
print("【ERROR】:用户名或者密码错误")
def sys_exit():
sign = input("确定要退出系统吗?(yes or no):")
# if sign == "yes" or sign == "y":
# if sign in ["yes", "y", "Y", "YES"]:
if sign.lower() in ["yes", "y"]:
print("【INFO】:成功退出系统!")
sys.exit()
def main():
# 先判断目录下有没有这个文件
if os.path.exists(file_name):
load_info()
else:
# 就证明没有这个文件,就应该创建文件
f = open(file_name, "w", encoding="utf-8")
f.write("[]")
f.close()
load_info()
while True:
# 打印界面
welcome()
# 让用户输入数字,表示对应的操作
command = input("请输入数字1~5表示对应的操作:")
# 判断用户输入的这个数字command,根据它来执行对应的功能(代码)
if command == "1":
# 添加名片 就是 往大列表info_list,添加某个人的名片
add_info()
elif command == "2":
# 删除名片
# [{"name": '诸葛亮', "age": 40, "sex": "男"}, {"name": '刘备', "age": 45, "sex": "男"}]
del_info()
elif command == "3":
# 修改名片
#
modify_info()
elif command == "4":
# 查询名片
# [['诸葛亮', '40', '男'], ['刘备', '45', '男']]
search_info()
elif command == "5":
# 查询所有名片
search_all_info()
elif command == "6":
# 退出系统
# break
save_info()
sys_exit()
else:
print("【ERROR】:请务必输入数字1~5")
main() # 入口函数
7.9 综合应用:格式校验题
'''
格式校验题
2、用户名和密码格式校验程序
要求从键盘输入用户名和密码,校验格式是否符合规则,如果不符合,打印出不符合的原因,
并提示重新输入,校验通过就打印出"校验格式复合规则"
a、用户名长度6-20,用户名必须以字母开头
b、密码长度至少6位,不能为纯数字,不能有空格
提示:
str1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
if 字符串[0] in str1 可以判断第一个是不是字母
'''
while True:
name = input('请输入用户名:(长度6-20,必须以字母开头)')
if not (6 <= len(name) <= 20):
print('长度必须6-20')
continue
elif name[0] not in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ":
print('用户名必须以字母开头')
continue
else:
break
while True:
password1 = input('请输入密码:(长度至少6位,不能为纯数字,不能有空格)')
if len(password1) < 6:
print('长度至少6位')
continue
elif ' ' in password1:
print('不能有空格')
continue
elif password1.isdigit():
print('不能为纯数字')
continue
else:
break
print("校验格式复合规则")
7.10 综合应用:求斐波那契数列
'''
使用函数求斐波那契数列的前20个数(直接打印出来)。
提示:
斐波那契数列:1,1,2,3,5,8,13,21...即: 起始两项均为1,此后的项分别为前两项之和。
(方法有太多种,用你会的一种来解决就好)
'''
def fn(n): # 求第n个斐波那契数
if n == 1:
return 1
elif n == 2:
return 1
else:
ret = fn(n-1) + fn(n-2)
return ret
def main(m): # 前m个斐波那契数
feibo = []
for i in range(1, m + 1):
feibo.append(fn(i))
print(feibo)
main(20)