1. 程式人生 > >7 檔案操作 綜合應用

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)