7 檔案操作 綜合應用
阿新 • • 發佈:2018-11-12
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)