從零開始的python世界的闖蕩之視頻學習篇 第七話 文件
#由於前段時間的不可抗力,沒時間寫文章,以後爭取一天一篇。再次說明,這文章只是個人學習過程#中的筆記,並不是什麼教程。有許多不足,以及錯誤的地方。
一.文件的初識
#文件:是用來保存一些數據的容器。 就好比,程序中的值,放在變數中,文件也可以同樣理解,只不過# 變數在關閉程序時,數據將會消失。而文件是保存在硬碟中,就算關閉程序,依然還有數據。# 當需要使用時,可以進行讀取數據#文件的作用:把一些數據存放起來,可以讓程序下一次執行的時候直接使用,而不必重新製作一份,# 省時省力。
二.文件的打開與關閉
#在現實生活中,咱們利用word寫一份簡歷的步驟如下:# 1.打開word軟體# 2.新建一個word文件# 3.寫入個人簡歷信息# 4.保存文件# 5. 關閉軟體#同理,在python中操作文件的整體過程與上述基本相似,即:# 1.運行python程序# 2.打開文件# 3.讀寫數據# 4.保存並關閉文件# 5.程序執行完畢#打開文件:在Python中使用open函數,可以打開一個已經存在的文件,或者新建一個不存在的文件。# 簡單格式: open(文件名,訪問模式) ---》返回一個文件對象,需要用變數接受# 後續對文件的操作都是利用這個文件對象來實現#舉例:
#對訪問模式進行說明:
#既然有打開文件,必然就有關閉文件。#在python中利用close()方法進行關閉文件。#舉例:
#需要補充的是: 在python中,對文件進行修改,其生效時間是,在關閉文件的時候,也就是可以理解為# 關閉文件時,才把數據通過文件保存在硬碟上。 之前咱們都是講數據寫到內存中。# 所以,對於文件的關閉是很重要的。 #特別的: 在Python中,解釋器,會給我們自動的關閉文件,所以,儘管你忘記了關閉文件,在大多數# 情況下影響不大。# 倘若你是個健忘而喜歡偷懶的人,那麼python給你準備了一個懶人模式的打開/關閉文件的格式#格式如下: with open(文件名,訪問模式) as 自定義文件對象名: 代碼塊#採用這種格式打開文件的時候,不需要人為手動的去關閉文件,在末尾,會自動的去關閉文件。#舉例:
三.文件的讀寫
#1.對文件進行寫數據# 涉及的方法為: write()# 簡單的格式: 文件對象.write("寫入文件的數據")#舉例:
#2.讀數據# 涉及的方法有:read(),readlines(),readline()#read():可以從文件中讀取自定義長度的數據,以位元組為單位。# 簡單格式: 文件對象.read(num) -->Num不寫默認為讀取全部數據#舉例:
#由上面例子可以得出一個結論,當你獲取了數據的時候,下次獲取時,將不從文件開頭開始進行,而是#從上次獲取數據的地方開始。(依舊遵循,下標從0開始,並且顧前不顧尾,5代表5個位元組的數,不是索引)#圖示:
#readlines(): 形如read()沒有參數的結果,它可以按照行的方式,把整個文件數據都讀取出來,然後# 保存在一個列表中,每一行的數據代表一個元素#簡單格式 : 變數 = 文件對象.readlines()#舉例:
#readline(): 一行一行的讀取文件數據。##簡單格式 :f.readline()#舉例:
#特別的,當不知道文件的具體大小,最好不要將文件數據全部讀取出來,如果你有個10G的文件,你全部#進行讀取的話,內存會被你擠爆的。也許會導致死機等情況。
四.文件的常用方法
#1.獲取當前讀寫的位置#涉及方法: tell()#tell(): 返回當前讀寫的位置。#簡單格式 : 變數 = 文件對象.tell()#舉例:
#2.定位到某個位置#涉及方法: seek()#seek() : 將當前位置定位到指定的位置。# 簡單格式: 文件對象.seek(偏移量,參照位)# 參照位 : 0 代表開頭 1 代表當前位置 2 代表末尾#舉例:
#由上面例子可以得出,參照位,如果不寫的話,默認為0 #seek(0) -->常用來回到文件首位#seek(0,1) -->常用來獲取到目前位置 與f.tell()功能類似#seek(0,2) -->常用來移動到文件的末尾
五.對文件的操作(os 模塊)
#本節介紹 有關OS模塊中對文件操作的方法#1.文件的重命名# os.rename(): 對文件進行重命名操作# 簡單格式: os.rename(需要修改的文件名,新的文件名)# 同樣的,不寫全路徑,默認為與程序相同的路徑。#舉例:
#2.刪除文件# os.remove() :將文件進行刪除# 簡單格式 : os.remove(要刪除文件的名字)#舉例:
#接下來是有關文件夾的操作#3.創建文件夾# mkdir() : 在linux中有一個相同的命令。用來創建文件夾#舉例:
#4.獲取當前工作目錄# getcwd() : 獲取當前工作目錄。#舉例:
#5.改變工作路徑# chdir(): 修改當前工作的路徑# 舉例:
#6.獲取目錄列表# listdir() : 獲取指定目錄下的文件及其文件夾,返回一個列表。默認為當前工作路徑。#舉例:
#7.刪除文件夾# rmdir() : 與linux下一樣的功能, 刪除一個空的文件夾,前提是文件夾為空##舉例:
六.序列化(json)
#當用文件保存數據的時候,會發現,write方法,只接受字元串類型的數據,如果我們要保存類似於列表,字典這種較為複雜的數據類型時,就會比較麻煩,我們需要手動的去將它們轉化為字元串格式。#很巧的是,Python中有一個json模塊,可以自動化的幫我們將複雜的數據類型轉化為字元串然後寫入#到文件中。#序列化 :將複雜的數據類型,轉化為字元串。 常用json.dumps(內容) 進行序列化,返回的是一個字元串#返序列化 : 將字元串 轉化為 原來的數據類型。 常用json.loads(內容) 進行反序列化, 返回的是字元串原來的數據類型#舉例:
七.本節練習
1.製作文件的備份 輸入文件的名字,然後程序自動完成對文件進行備份
#答案: (特別說明,因為還沒有學習捕獲異常,所以暫時沒有考慮文件不存在拋出異常的情況)#-*- coding:utf8 -*-def back_up_file(filename): #傳遞進來的是一個文件名 #1.打開文件 with open(filename,"r") as old_file: with open("[備份]"+filename,"w") as new_file: #2.在內部再打開一個文件,將名字寫成備份 for line in old_file.readlines(): new_file.write(line) #3.將原文件數據寫入到備份文件中。 #4.關閉兩文件 print("備份完成!")filename = input("請輸入需要備份的文件名:")back_up_file(filename)
2.批量修改文件名 在文件名前 加上 【jasonmer】的前綴,只考慮文本文件即.txt結尾
#答案:#-*- coding:utf-8 -*-import os def rename_file(file_list): #傳遞進來的是帶有文件名的列表 #1.設置好前綴 first = "[jasonmer]-" #2.遍歷文件名,進行修改,只修改.txt結尾的文件 for filename in file_list: if ".txt" in filename and first not in filename: os.rename(filename,first+filename) print("修改了:%s文件"%(filename)) print("修改完畢")dir = input("請輸入需要批量修改文件的所在目錄:")rename_file(os.listdir(dir)) #../ 父目錄 ./當前目錄
3.讀取一個文件,顯示除了以井號(#)開頭的行以外的所有行
#答案: (當打開的文件中有中文,需要指明打開文件時使用的編碼,如本文,設置了urf-8)#-*- coding:utf-8 -*-def print_info(filename): #傳入一個文件名 with open(filename,"r",encoding="utf-8") as file: #打開文件 for lines in file: #遍歷,一行一行讀, if lines[0] != "#": #判斷第一個字元是否為#號。是的話,不輸出。 #並且設置輸出後不換行。 因為文件中末尾自動換行了。 print(lines,end="") filename = input("請輸入文件名:")print_info(filename)
4.製作一個"密碼薄",其可以存儲一個網址(例如 http://www.itcast.cn),和一個密碼(例如 123456),請編寫程序完成這個「密碼薄」的增刪改查功能,並且實現文件存儲功能
#答案:(依舊是只實現了簡單的功能,未加判斷輸入的數據是否合法,文件是否存在,且沒有利用序列化)#-*- coding:utf-8 -*-def save_file(list_pwd): #保存文件函數 with open("passwd.txt","a",encoding="utf-8") as file_pwd: for data in list_pwd: file_pwd.write(data+" ") file_pwd.write("
") print("保存完成")def read_file(): list_pwd = [] with open("passwd.txt","r",encoding="utf-8") as file_pwd: for lines in file_pwd.readlines(): list_pwd.append(lines.split()) print("數據載入完畢") return list_pwddef updata_file(list_pwd): #更新文件的函數 #打開文件,將內容進行輸入 接受的數據格式為:列表[元素,元素],元素也是列表 with open("passwd.txt","w") as file_pwd: for line in list_pwd: file_pwd.write("%s %s
"%(line[0],line[1])) print("數據已重新更新!")def print_info(): #密碼簿的主界面 print("-"*30) print("歡迎進入密碼簿管理系統 v1.1") print("1.添加密碼") print("2.刪除密碼") print("3.修改密碼") print("4.顯示密碼") print("5.退出系統") print("-"*30)def add_pwd(): #保存密碼的函數 list_pwd = [] list_pwd.append(input("請輸入網址名:")) list_pwd.append(input("請輸入對應密碼:")) print("添加完成") save_file(list_pwd)def del_pwd(): #刪除密碼的函數 #1.讀取數據 list_pwd = read_file() if list_pwd : #2.判斷是否為空 #3.鍵入網址和密碼 geturl = input("請輸入你所要刪除的網址:") getpwd = input("情輸入你網址對應的密碼:") i = 0 for line in list_pwd: #4.尋找後刪除 if geturl == line[0] and getpwd == line[1]: del(list_pwd[i]) print("刪除成功") break i +=1 else: print("沒有符合的條目!") #5.將新的列表進行更新 updata_file(list_pwd) else: print("暫時沒有任何數據")def alter_pwd(): #修改密碼的函數 #1.獲取數據 list_pwd = read_file() #2.判斷是否有數據 if list_pwd: #3.鍵入舊的網址,和舊的密碼 geturl = input("請輸入欲修改的網址:") getpwd = input("請輸入欲修改網址的密碼:") for line in list_pwd: #4.找到後,進行修改。 if geturl == line[0] and getpwd == line[1]: line[0] = input("請輸入你的新網址:") line[1] = input("請輸入你的新密碼:") print("修改完畢") break else: print("沒有符合條件的條目") #5.進行更新數據 updata_file(list_pwd) else: print("暫時沒有任何數據")def show_pwd(): #顯示密碼的函數 #1.讀取數據,數據格式為列表[],元素也是列表,先是網址,後是密碼 list_pwd = read_file() #2.遍歷進行顯示信息 if list_pwd : for line in list_pwd: print("網址為:%s 密碼為:%s"%(line[0],line[1])) else: print("暫時沒有任何數據")def exit_pwd(): #退出程序的函數 print("謝謝使用,再見") exit()#主函數while True: print_info() num = int(input("請輸入你的操作:")) if num ==1 : add_pwd() elif num ==2 : del_pwd() elif num ==3 : alter_pwd() elif num ==4 : show_pwd() elif num ==5 : exit_pwd() else: print("輸入錯誤,請重新輸入")
#答案 (要求使用序列化,文件化,依舊是簡單版本,完成了最基本的要求,未對鍵入信息進行判斷)#-*- coding:utf-8 -*-import jsondef save_file(student_dict): #保存數據的函數 #傳遞進來一個字典,保存了學生的信息。 #1.打開文件 with open("student_file.txt","a",encoding="utf-8") as stu_file: #2.將數據序列化,保存寫入到文件中 stu_file.write(json.dumps(student_dict)+"
") print("保存數據成功")def read_file(): #讀取文件數據的函數 stu_list = [] #1.打開文件,讀取數據 with open("student_file.txt","r",encoding="utf-8") as stu_file: #2.將字元串反序列化,保存在一個列表中,然後返回回去 for student_dict in stu_file.readlines(): stu_list.append(json.loads(student_dict)) print("讀取數據成功!") return stu_listdef updata_file(student_list): #更新文件數據的函數 #1.傳遞過來的值是一個列表,裡面每一個元素都是字典 #2.打開文件,重新寫入文件,覆蓋原文件 with open("student_file.txt","w",encoding="utf-8") as stu_file: for line in student_list: #3.將元素進行序列化,再寫入 stu_file.write(json.dumps(line)) print("數據更新完畢!")def print_info(): #程序的主界面 print("-"*40) print("歡迎進入學生管理系統 V1.3") print("1.添加學生信息") print("2.刪除學生信息") print("3.修改學生信息") print("4.顯示所有學生信息") print("5.退出程序") print("-"*40)def add_student(): #添加學生信息 student_dict ={} #用來保存學生個人信息的字典 student_dict["name"] = input("請輸入你的名字:") student_dict["age"] = input("請輸入你的年齡:") student_dict["stu_ID"] = input("請輸入你的學號:") save_file(student_dict) print("添加學生信息成功!")def del_student(): #刪除學生信息 #1.讀取數據,傳遞過來的是一個列表,元素是字典 student_list = read_file() #2.判斷是否有數據 if student_list: #3.鍵入學生名 name = input("請輸入要刪除的學生姓名:") num = 0 for i in student_list: #4.尋找學生是否存在,存在就刪除 if name == i["name"]: del(student_list[num]) print("刪除成功") break num +=1 else: print("沒有該學生信息") #5.操作完後需要及時更新數據 updata_file(student_list) else: print("暫時沒有任何學生信息")def alter_student(): #修改學生信息 #1.獲取學生數據 student_list = read_file() #2.判斷數據是否為空 if student_list: #3.鍵入學生姓名 name = input("請輸入舊的學生姓名:") for i in student_list: #4.尋找學生信息,然後進行修改 if name == i["name"]: i["name"] = input("請輸入你的新名字:") i["age"] = input("請輸入你的新年齡:") i["stu_ID"] = input("請輸入你的新學號:") print("修改學生信息成功") break else: print("沒有此學生的信息") #5.修改完後,及時更新數據 updata_file(student_list) else: print("暫時沒有任何學生記錄")def show_student(): #顯示學生信息 #1.讀取數據,現在的數據,都是一個一個字典 student_list = read_file() #2.判斷是否有數據 if student_list: for i in student_list: #3.將數據輸出 for key,value in i.items(): print("%s:%s"%(key,value),end=" ") print("") else: print("沒有學生信息")def exit_student(): #退出學生管理系統 print("謝謝使用,再見") exit()#主程序入口while True: print_info() num = int(input("請選擇你的操作(按數字就行):")) if num ==1 : add_student() elif num ==2 : del_student() elif num ==3 : alter_student() elif num ==4 : show_student() elif num ==5 : exit_student() else: print("輸入錯誤,請重新輸入")
推薦閱讀: