1. 程式人生 > 實用技巧 >檔案操作和OS模組的簡單操作

檔案操作和OS模組的簡單操作

檔案的作用

大家應該聽說過一句話:“好記性不如爛筆頭”。

不僅人的大腦會遺忘事情,計算機也會如此,比如一個程式在執行過程中用了九牛二虎之力終於計算出了結果,試想一下如果不把這些資料存放起來,相比重啟電腦之後,“哭都沒地方哭了”

可見,在把資料儲存起來有做麼大的價值

使用檔案的目的:

  就是把一些儲存存放起來,可以讓程式下一次執行的時候直接使用,而不必重新制作一份,省時省力

檔案的開啟與關閉

想一想:

如果想用word編寫一份簡歷,應該有哪些流程呢?

  1. 開啟word軟體,新建一個word檔案
  2. 寫入個人簡歷資訊
  3. 儲存檔案
  4. 關閉word軟體

同樣,在操作檔案的整體過程與使用word編寫一份簡歷的過程是很相似的

    

  1. 開啟檔案,或者新建立一個檔案
  2. 讀/寫資料
  3. 關閉檔案

開啟檔案

在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檔案,並且寫入一對中括號[]即可
  • 等到後面講解完異常之後就解決了這個問題