檔案操作和OS模組的簡單操作
檔案的作用
大家應該聽說過一句話:“好記性不如爛筆頭”。
不僅人的大腦會遺忘事情,計算機也會如此,比如一個程式在執行過程中用了九牛二虎之力終於計算出了結果,試想一下如果不把這些資料存放起來,相比重啟電腦之後,“哭都沒地方哭了”
可見,在把資料儲存起來有做麼大的價值
使用檔案的目的:
就是把一些儲存存放起來,可以讓程式下一次執行的時候直接使用,而不必重新制作一份,省時省力
檔案的開啟與關閉
想一想:
如果想用word編寫一份簡歷,應該有哪些流程呢?
- 開啟word軟體,新建一個word檔案
- 寫入個人簡歷資訊
- 儲存檔案
- 關閉word軟體
同樣,在操作檔案的整體過程與使用word編寫一份簡歷的過程是很相似的
- 開啟檔案,或者新建立一個檔案
- 讀/寫資料
- 關閉檔案
開啟檔案
在python,使用open函式,可以開啟一個已經存在的檔案,或者建立一個新檔案
open(檔名,訪問模式)
示例如下:
f = open('test.txt', 'w')
說明:
訪問模式 | 說明 |
---|---|
r | 以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。 |
w | 開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 |
a | 開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。 |
rb | 以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。這是預設模式。 |
wb | 以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 |
ab | 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。 |
r+ | 開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。 |
w+ | 開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 |
a+ | 開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加模式。如果該檔案不存在,建立新檔案用於讀寫。 |
rb+ | 以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。 |
wb+ | 以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 |
ab+ | 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。 |
<2>關閉檔案
close( )
示例如下:
# 新建一個檔案,檔名為:test.txt
f = open('test.txt', 'w')
# 關閉這個檔案
f.close()
檔案的讀寫
<1>寫資料(write)
使用write()可以完成向檔案寫入資料
demo: 新建一個檔案file_write_test.py
,向其中寫入如下程式碼:
f = open('test.txt', 'w')
f.write('hello world, i am here!')
f.close()
執行之後會在file_write_test.py
檔案所在的路徑中建立一個檔案test.txt
,其中資料如下:
注意:
- 如果檔案不存在那麼建立,如果存在那麼就先清空,然後寫入資料
追加
f= open('text.txt','a')
f.write('122559阿斯弗')
f.close()
<2>讀資料(read)
使用read(num)可以從檔案中讀取資料,num表示要從檔案中讀取的資料的長度(單位是位元組),如果沒有傳入num,那麼就表示讀取檔案中所有的資料
demo: 新建一個檔案file_read_test.py
,向其中寫入如下程式碼:
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!
注意:
- 如果用open開啟檔案時,如果使用的"r",那麼可以省略,即只寫
open('test.txt')
<3>讀資料(readlines)
就像read沒有引數時一樣,readlines可以按照行的方式把整個檔案中的內容進行一次性讀取,並且返回的是一個列表,其中每一行的資料為一個元素
#coding=utf-8
f = open('test.txt', 'r')
content = f.readlines()
print(type(content))
i=1
for temp in content:
print("%d:%s" % (i, temp))
i += 1
f.close()
執行現象:
<4>讀資料(readline)
#coding=utf-8
f = open('test.txt', 'r')
content = f.readline()
print("1:%s" % content)
content = f.readline()
print("2:%s" % content)
f.close()
應用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()
檔案的相關操作
有些時候,需要對檔案進行重新命名、刪除等一些操作,python的os模組中都有這麼功能
1. 檔案重新命名
os模組中的rename()可以完成對檔案的重新命名操作
rename(需要修改的檔名, 新的檔名)
import os
os.rename("畢業論文.txt", "畢業論文-最終版.txt")
2. 刪除檔案
os模組中的remove()可以完成對檔案的刪除操作
remove(待刪除的檔名)
import os
os.remove("畢業論文.txt")
3. 建立資料夾
import os
os.mkdir("張三")
4. 獲取當前目錄
import os
os.getcwd()
5. 改變預設目錄
import os
os.chdir("../")
6. 獲取目錄列表
import os
os.listdir("./")
7. 刪除資料夾
import os
os.rmdir("張三")
應用:批量修改檔名
--執行程式之前
執行程式之後
2>參考程式碼
#coding=utf-8
# 批量在檔名前加字首
import os
funFlag = 1 # 1表示新增標誌 2表示刪除標誌
folderName = './renameDir/'
# 獲取指定路徑的所有檔名字
dirList = os.listdir(folderName)
# 遍歷輸出所有檔名字
for name in dirList:
print name
if funFlag == 1:
newName = '[東哥出品]-' + name
elif funFlag == 2:
num = len('[東哥出品]-')
newName = name[num:]
print newName
os.rename(folderName+name, folderName+newName)
綜合應用:學生管理系統(檔案版)
import time
import os
# 定一個列表,用來儲存所有的學生資訊(每個學生是一個字典)
info_list = []
def print_menu():
print("---------------------------")
print(" 學生管理系統 V1.0")
print(" 1:新增學生")
print(" 2:刪除學生")
print(" 3:修改學生")
print(" 4:查詢學生")
print(" 5:顯示所有學生")
print(" 6:儲存資料")
print(" 7:退出系統")
print("---------------------------")
def add_new_info():
"""新增學生資訊"""
global info_list
new_name = input("請輸入姓名:")
new_tel = input("請輸入手機號:")
new_qq = input("請輸入QQ:")
for temp_info in info_list:
if temp_info['name'] == new_name:
print("此使用者名稱已經被佔用,請重新輸入")
return # 如果一個函式只有return就相當於讓函式結束,沒有返回值
# 定義一個字典,用來儲存使用者的學生資訊(這是一個字典)
info = {}
# 向字典中新增資料
info["name"] = new_name
info["tel"] = new_tel
info["qq"] = new_qq
# 向列表中新增這個字典
info_list.append(info)
def del_info():
"""刪除學生資訊"""
global info_list
del_num = int(input("請輸入要刪除的序號:"))
if 0 <= del_num < len(info_list):
del_flag = input("你確定要刪除麼?yes or no")
if del_flag == "yes":
del info_list[del_num]
else:
print("輸入序號有誤,請重新輸入")
def modify_info():
"""修改學生資訊"""
global info_list
modify_num = int(input("請輸入要修改的序號:"))
if 0 <= modify_num < len(info_list):
print("你要修改的資訊是:")
print("name:%s, tel:%s, QQ:%s" % (info_list[modify_num]['name'],
info_list[modify_num]['tel'],info_list[modify_num]['qq']))
info_list[modify_num]['name'] = input("請輸入新的姓名:")
info_list[modify_num]['tel'] = input("請輸入新的手機號:")
info_list[modify_num]['qq'] = input("請輸入新QQ:")
else:
print("輸入序號有誤,請重新輸入")
def search_info():
"""查詢學生資訊"""
search_name = input("請輸入要查詢的學生姓名:")
for temp_info in info_list:
if temp_info['name'] == search_name:
print("查詢到的資訊如下:")
print("name:%s, tel:%s, QQ:%s" % (temp_info['name'],
temp_info['tel'], temp_info['qq']))
break
else:
print("沒有您要找的資訊....")
def print_all_info():
"""遍歷學生資訊"""
print("序號\t姓名\t\t手機號\t\tQQ")
i = 0
for temp in info_list:
# temp是一個字典
print("%d\t%s\t\t%s\t\t%s" % (i, temp['name'], temp['tel'], temp['qq']))
i += 1
def save_data():
"""載入之前儲存的資料"""
f = open("info_data.data", "w")
f.write(str(info_list))
f.close()
def load_data():
"""載入之前儲存的資料"""
global info_list
f = open("info_data.data")
content = f.read()
info_list = eval(content)
f.close()
def main():
"""用來控制整個流程"""
# 載入資料(1次即可)
load_data()
while True:
# 1. 列印功能
print_menu()
# 2. 獲取使用者的選擇
num = input("請輸入要進行的操作(數字):")
# 3. 根據使用者選擇,做相應的事情
if num == "1":
# 新增學生
add_new_info()
elif num == "2":
# 刪除學生
del_info()
elif num == "3":
# 修改學生
modify_info()
elif num == "4":
# 查詢學生
search_info()
elif num == "5":
# 遍歷所有的資訊
print_all_info()
elif num == "6":
# 儲存資料到檔案中
save_data()
elif num == "7":
# 退出系統
exit_flag = input("親,你確定要退出麼?~~~~(>_<)~~~~(yes or no) ")
if exit_flag == "yes":
break
else:
print("輸入有誤,請重新輸入......")
input("\n\n\n按回車鍵繼續....")
os.system("clear") # 呼叫Linux命令clear完成清屏
# 程式的開始
main()
注意:
- 以上程式,在執行之前請先建立info_data.data檔案,並且寫入一對中括號[]即可
- 等到後面講解完
異常
之後就解決了這個問題