7 文件操作 综合应用

7.1 文件操作介绍

  • 使用文件的目的:就是把一些存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力

7.2 文件的打开和关闭

f = open('test.txt', 'w')
f.close()

7.3 文件的读写

  • 写数据write
f = open('test.txt', 'w')
f.write('hello world, i am here!')
f.close()
  • 读数据read
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!
  • 读数据readlines
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)

猜你喜欢

转载自blog.csdn.net/qq_43014129/article/details/83002782