標籤:轉換 list 一個 rem %s 簡單 names nbsp 字元
最近開始學習python第九章檔案,做課後題中遇到了些問題,記錄下來以便後續複習或最佳化錯誤修正。
1.寫檔案時候擷取時間對象不知如何轉化為字串存入檔案,後面再讀檔案從字串轉為對象,後來查到可以用strftime和strptime2個函數來轉換。
a.時間datetime對象A可以通過A.strftime(“%Y-%m-%d %H:%M:%S %f”)轉換為字串
b.擷取的字串A可以通過datetime.datetime.strptime(A,格式化字串(如上))轉換為datetime時間對象。
同時瞭解到可以用pickle等模組將檔案內容序列化和還原序列化,簡單處理,省去細節過程,這個模組讀取隱藏檔是以二進位方式進行,所以w和r後必須加b。還有一個據說更好的模組shelve,尚未瞭解 。
例如: with open(path,‘wb‘) as f:
pickle.dump(自訂結構對象,f)
這裡dump將結構對象序列化存入檔案,還有一個dumps它只用於字串。
with open(path,‘rb‘) as f:
pickle.load(f)
這裡讀取檔案內容還原序列化為原來的結構對象,loads同樣也只應用於字串。
另外在open(檔案名稱,開啟檔案)中遇到很多中英文路徑的問題,報異常無法找到,通過把路徑字串轉化為unicode後解決。
2.在匹配某些格式的檔案行時,應用到了Regex。這裡發現因為在[ ]中‘-’有特殊意義,所以如果要匹配‘-’則需要把它放到最前面避免引起錯誤如[-+*],同時在中括弧中這些有特殊意義的符號不需要前面加‘\’來匹配本身。
在編譯正則時compile(str),如果str中有多個分組(),而某些分組只匹配不需要捕獲的,需要在括弧中加?:如(?:\d{1,3})
3.在對列表刪除的時候,發現remove(元素),有重複元素的時候,只能刪除一個元素,可以用set先去重再刪。另外迴圈中最好不要刪除元素,導致迴圈對象變化容易出錯,可以深copy一個對象,然後迴圈原來的對象,對新對象進行操作。
4.windows系統中,用cmd顯示python指令碼輸出的print時,因為cmd軟體解碼方式為GBK,如果指令碼是用UTF-8寫的,則print輸出的語句需要從UTF-8解碼為unicode再編碼為GBK後,才能在CMD中正常顯示
5.檔案通用方式:開啟多個檔案可以這麼寫:with open() as f1,open() as f2: 想要清除檔案內容用f.truncate() os.getcwd()擷取當前路徑。
一般想要找到某個檔案,我喜歡用os.listdir()然後拼接路徑檔案,遞迴直到每個路徑下沒有目錄只有檔案。 這次發現遺漏了os.walk()它會便利所有目錄可以得到一個三元tupple(dirpath, dirnames, filenames),
第一個為起始路徑,第二個為起始路徑下的檔案夾,第三個是起始路徑下的檔案。
dirpath 是一個string,代表目錄的路徑,
dirnames 是一個list,包含了dirpath下所有子目錄的名字。
filenames 是一個list,包含了非目錄檔案的名字。
這些名字不包含路徑資訊,如果需要得到全路徑,需要使用os.path.join(dirpath, name).
6.shutil模組, shutil.copy()可以直接複製一個檔案或目錄到另一個 shutil.rmtree()可以遞迴地刪除一個目錄及其內所有內容。
python核心編程第九章檔案部分雜記