datawhale組隊學習——Python基礎——檔案與檔案系統

2020-08-08 21:50:45

下內容來自datawhale組隊學習——Python基礎,供自己學習記錄,轉載還請附上部落格鏈接!

檔案與檔案系統

知識點

1. 檔案與檔案系統

開啓檔案
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True) Open file and return a stream. Raise OSError upon failure.
#file: 必需,檔案路徑(相對或者絕對路徑)。
#mode: 可選,檔案開啓模式
#buffering: 設定緩衝
#encoding: 一般使用utf8
#errors: 報錯級別
#newline: 區分換行符

常見的mode如下表所示:

開啓模式 執行操作
‘r’ 以只讀方式開啓檔案。檔案的指針將會放在檔案的開頭。這是預設模式。
‘w’ 開啓一個檔案只用於寫入。如果該檔案已存在則開啓檔案,並從開頭開始編輯. 即原有內容會被刪除。如果該檔案不存在,建立新檔案。
‘x’ 寫模式,新建一個檔案,如果該檔案已存在則會報錯。
‘a’ 追加模式,開啓一個檔案用於追加。如果該檔案已存在,檔案指針將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。
‘b’ 以二進制模式開啓檔案。一般用於非文字檔案,如:圖片。
‘t’ 以文字模式開啓(預設)。一般用於文字檔案,如:txt。
‘+’ 可讀寫模式(可新增到其它模式中使用)
檔案物件方法
名稱 含義
fileObject.close() 用於關閉一個已開啓的檔案。關閉後的檔案不能再進行讀寫操作, 否則會觸發ValueError錯誤。
fileObject.read([size]) 用於從檔案讀取指定的字元數,如果未給定或爲負則讀取所有。
fileObject.readline() 讀取整行,包括 「\n」 字元。
fileObject.readlines() 用於讀取所有行(直到結束符 EOF)並返回列表,該列表可以由 Python 的 for… in … 結構進行處理。
fileObject.tell() 返迴檔案的當前位置,即檔案指針當前位置。
fileObject.seek(offset[, whence]) 用於移動檔案讀取指針到指定位置。①offset:開始的偏移量,也就是代表需要移動偏移的位元組數,如果是負數表示從倒數第幾位開始。②whence:可選,預設值爲 0。給 offset 定義一個參數,表示要從哪個位置開始偏移;0 代表從檔案開頭開始算起,1 代表從當前位置開始算起,2 代表從檔案末尾算起。
fileObject.write(str) 用於向檔案中寫入指定字串,返回的是寫入的字元長度。
fileObject.writelines(sequence) 向檔案寫入一個序列字串列表,如果需要換行則要自己加入每行的換行符\n。
簡潔的 with 語句

(ps:未懂)
一些物件定義了標準的清理行爲,無論系統是否成功的使用了它,一旦不需要它了,那麼這個標準的清理行爲就會執行。

關鍵詞 with 語句就可以保證諸如檔案之類的物件在使用完之後一定會正確的執行它的清理方法。

try:
    f = open('myfile.txt', 'w')
    for line in f:
        print(line)
except OSError as error:
    print('出錯啦!%s' % str(error))
finally:
    f.close()

# 出錯啦!not readable

這段程式碼執行完畢後,就算在處理過程中出問題了,檔案 f 總是會關閉。

try:
    with open('myfile.txt', 'w') as f:
        for line in f:
            print(line)
except OSError as error:
    print('出錯啦!%s' % str(error))

# 出錯啦!not readable    

2. OS 模組中關於檔案/目錄常用的函數

我們所知道常用的操作系統就有:Windows,Mac OS,Linu,Unix等,這些操作系統底層對於檔案系統的存取工作原理是不一樣的,因此你可能就要針對不同的系統來考慮使用哪些檔案系統模組……,這樣的做法是非常不友好且麻煩的,因爲這樣就意味着當你的程式執行環境一改變,你就要相應的去修改大量的程式碼來應對。

有了OS(Operation System)模組,我們不需要關心什麼操作系統下使用什麼模組,OS模組會幫你選擇正確的模組並呼叫。

名稱 含義
os.getcwd() 用於返回當前工作目錄。
os.chdir(path) 用於改變當前工作目錄到指定的路徑。
listdir (path=’.’) 返回path指定的資料夾包含的檔案或資料夾的名字的列表。
os.mkdir(path) 建立單層目錄,如果該目錄已存在拋出異常。
os.makedirs(path) 用於遞回建立多層目錄,如果該目錄已存在拋出異常。
os.remove(path) 用於刪除指定路徑的檔案。如果指定的路徑是一個目錄,將拋出 OSError。
os.rmdir(path) 用於刪除單層目錄。僅當這資料夾是空的纔可以, 否則, 拋出 OSError。
os.removedirs(path) 遞回刪除目錄,從子目錄到父目錄逐層嘗試刪除,遇到目錄非空則拋出異常。
os.rename(src, dst) 方法用於命名檔案或目錄,從 src 到 dst,如果 dst 是一個存在的目錄, 將拋出 OSError。
os.system(command) 執行系統的shell命令(將字串轉化成命令)
os.curdir 指代當前目錄(.)
os.pardir 指代上一級目錄(…)
os.sep 輸出操作系統特定的路徑分隔符(win下爲\,Linux下爲/)
os.linesep 當前平臺使用的行終止符(win下爲\r\n,Linux下爲\n)
os.name 指代當前使用的操作系統(包括:‘mac’,‘nt’)
os.path.basename(path) 去掉目錄路徑,單獨返迴檔名
os.path.dirname(path) 去掉檔名,單獨返回目錄路徑
os.path.join(path1[, path2[, …]]) 將 path1,path2 各部分組合成一個路徑名
os.path.split(path) 分割檔名與路徑,返回(f_path,f_name)元組。如果完全使用目錄,它會將最後一個目錄作爲檔名分離,且不會判斷檔案或者目錄是否存在。
os.path.splitext(path) 分離檔名與擴充套件名,返回(f_path,f_name)元組。
os.path.getsize(file) 返回指定檔案大小,單位是位元組。
os.path.getatime(file) 返回指定檔案最近的存取時間
os.path.getctime(file) 返回指定檔案的建立時間
os.path.getmtime(file) 返回指定檔案的最新的修改時間
浮點型秒數,可用time 模組的gmtime()或localtime()函數換算
os.path.exists(path) 判斷指定路徑(目錄或檔案)是否存在
os.path.isabs(path) 判斷指定路徑是否爲絕對路徑
os.path.isdir(path) 判斷指定路徑是否存在且是一個目錄
os.path.isfile(path) 判斷指定路徑是否存在且是一個檔案
os.path.islink(path) 判斷指定路徑是否存在且是一個符號鏈接
os.path.ismount(path) 判斷指定路徑是否存在且是一個懸掛點
os.path.samefile(path1,path2) 判斷path1和path2兩個路徑是否指向同一個檔案

3. 序列化與反序列化

Python 的 pickle 模組實現了基本的數據序列和反序列化。

通過 pickle 模組的序列化操作我們能夠將程式中執行的物件資訊儲存到檔案中去,永久儲存。
通過 pickle 模組的反序列化操作,我們能夠從檔案中建立上一次程式儲存的物件。
pickle模組中最常用的函數爲:

pickle.dump(obj, file, [,protocol]) 將obj物件序列化存入已經開啓的file中。

obj:想要序列化的obj物件。
file:檔名稱。
protocol:序列化使用的協定。如果該項省略,則預設爲0。如果爲負值或HIGHEST_PROTOCOL,則使用最高的協定版本。
pickle.load(file) 將file中的物件序列化讀出。

file:檔名稱。

import pickle

dataList = [[1, 1, 'yes'],
            [1, 1, 'yes'],
            [1, 0, 'no'],
            [0, 1, 'no'],
            [0, 1, 'no']]
dataDic = {0: [1, 2, 3, 4],
           1: ('a', 'b'),
           2: {'c': 'yes', 'd': 'no'}}

# 使用dump()將數據序列化到檔案中
fw = open(r'.\dataFile.pkl', 'wb')

# Pickle the list using the highest protocol available.
pickle.dump(dataList, fw, -1)

# Pickle dictionary using protocol 0.
pickle.dump(dataDic, fw)
fw.close()

# 使用load()將數據從檔案中序列化讀出
fr = open('dataFile.pkl', 'rb')
data1 = pickle.load(fr)
print(data1)
data2 = pickle.load(fr)
print(data2)
fr.close()

# [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
# {0: [1, 2, 3, 4], 1: ('a', 'b'), 2: {'c': 'yes', 'd': 'no'}}

練習題

1、開啓中文字元的文件時,會出現亂碼,Python自帶的開啓檔案是否可以指定文字編碼?還是隻能用相關函數?

2、編寫程式查詢最長的單詞

輸入文件: res/test.txt

題目說明:

"""
   
Input file
   test.txt
   
Output file
   ['general-purpose,', 'object-oriented,']
   
"""
def longest_word(filename):
    # your code here
        pass