python——讀寫檔案
檔案有兩個關鍵的熟悉——檔名、路徑
有幾個需要注意的就是:
1.雖然資料夾名稱和檔名在Windows 和OS X 上是不區分大小寫的,但在Linux 上是區分大小寫的
2.倒斜槓‘\’和正斜槓‘/’ 要能夠分清楚(windows使用前者 OS X 以及Linux使用後者)
要使用就需要匯入OS模組
import os
1.os.path.join()——解決跨系統斜槓問題
有一個函式,很好的解決了系統環境的差異問題(其實就是斜槓的不同問題)
os.path.join()函式 將單個檔案和路徑上的文件夾名稱的字串傳遞給它,os.path.join()就會返回一個檔案路徑的字串,包含正
先來看一個例子:
os.path.join('usr', 'bin', 'spam')
在windows返回'usr\\bin\\spam'(請注意,倒斜槓有兩個,因為每個倒斜槓需要由另一個倒斜槓字元來轉義)。如果我在OS X 或Linux 上呼叫這個函式,該字串就會是'usr/bin/spam'。
如果需要建立檔名稱的字串,os.path.join()函式就很有用。這些字串將傳遞給幾個檔案相關的函式,本章將進行介紹。例如,下面的例子將一個檔名列表中的名稱,新增到資料夾名稱的末尾。
myFiles = ['accounts.txt', 'details.csv', 'invite.docx']
for filename in myFiles:
print(os.path.join('C:\\Users\\asweigart', filename))
C:\Users\asweigart\accounts.txt
C:\Users\asweigart\details.csv
C:\Users\asweigart\invite.docx
2.當前工作目錄
os.getcwd()——獲取當前工作目錄
os.chdir()——改變當前工作目錄
3.絕對路徑以及相對路徑
有兩種方法指定一個檔案路徑。
• “絕對路徑”,總是從根資料夾開始。
• “相對路徑”,它相對於程式的當前工作目錄。
還有點(.)和點點(..)資料夾。它們不是真正的資料夾,而是可以在路徑中使用的特殊名稱。單個的句點(“點”)用作資料夾目名稱時,是“這個目錄”的縮寫。兩個句點(“點點”)意思是父資料夾。
在path模組中有幾個函式是用來專門處理絕對路徑與相對路徑的
• 呼叫os.path.abspath(path)將返回引數的絕對路徑的字串。這是將相對路徑轉換為絕對路徑的簡便方法。
• 呼叫os.path.isabs(path),如果引數是一個絕對路徑,就返回True,如果引數是一個相對路徑,就返回False。
• 呼叫os.path.relpath(path, start)將返回從start 路徑到path 的相對路徑的字串。如果沒有提供start,就使用當前工作目錄作為開始路徑。
4.建立資料夾
os.makedirs() 這個函式會建立所有必要的中間資料夾,目的是確保完整路徑名存在。
5.os.path 模組
之前也有說到過幾個函式,現在再來補充一下幾個經常用到的函式
os.path.dirname(path)將返回一個字串,它包含path 引數中最後一個斜槓之前的所有內容。——目錄名稱
os.path.basename(path)將返回一個字串,它包含path 引數中最後一個斜槓之後的所有內容。——基本名稱
同時需要一個路徑的目錄名稱和基本名稱,就可以呼叫os.path.split(),獲得這兩個字串的元組,——兩者的元組
如果我們需要將每個資料夾分割出來,也就是返回每個資料夾的字串列表
大致意思就是 返回的資料大致是:['C:', 'Windows', 'System32', 'calc.exe']
如果需要這樣,請使用split()字串方法,並根據os.path.sep 中的字串進行分割。回憶一下,根據程式執行的計算機,os.path.sep 變數設定為正確的資料夾分割斜槓。
(其實就是字串的分割 os.path.sep 代表的就是分隔符——斜槓)
5.檢視檔案大小
os.path.getsize(path)將返回path 引數中檔案的位元組數。
os.listdir(path)將返回檔名字串的列表,包含path 引數中的每個檔案(請注意,這個函式在os 模組中,而不是os.path)。
6.檢查路徑有效性
• 如果path 引數所指的檔案或資料夾存在,呼叫os.path.exists(path)將返回True,否則返回False。——是否存在
• 如果path 引數存在,並且是一個檔案,呼叫os.path.isfile(path)將返回True,否則返回False。——檔案
• 如果path 引數存在,並且是一個資料夾,呼叫os.path.isdir(path)將返回True,否則返回False。——資料夾
關於檔案目錄以及檔名的 就先說到這
現在開始來看檔案讀寫的部分了,說到檔案 就需要分清處理什麼檔案了
“純文字檔案”只包含基本文字字元,不包含字體、大小和顏色資訊。帶有.txt 副檔名的文字檔案,以及帶有.py 副檔名的Python 指令碼檔案,都是純文字檔案的例子。它們可以被Windows 的Notepad 或OS X 的TextEdit應用開啟。你的程式可以輕易地讀取純文字檔案的內容,將它們作為普通的字串值。
“二進位制檔案”是所有其他檔案型別,諸如字處理文件、PDF、影象、電子表格和可執行程式。如果用Notepad 或TextEdit 開啟一個二進位制檔案,它看起來就像亂碼。
我們處理的就是純文字檔案,python在處理(讀寫)檔案的時候,一般就是三個步驟:
1.呼叫open()函式,返回一個File 物件。
2.呼叫File 物件的read()或write()方法。
3.呼叫File 物件的close()方法,關閉該檔案。
開啟檔案 python的預設模式是“讀模式”,如果你不希望依賴於Python 的默認值,也可以明確指明該模式,向open()傳入字串'r',作為第二個引數
‘r’預設模式 只能讀取 ,不能修改檔案內容
‘w’寫模式 覆蓋原有內容(檔案不存在的時候會新建)
‘a’新增模式 在已有檔案的末尾新增文字(檔案不存在的時候會新建)
關於讀檔案,當然不單單一個read()函式
readlines()方法,從該檔案取得一個字串的列表。列表中的每個字串就是文字中的每一行。
關於寫檔案 需要注意一點:write()方法不會像print()函式那樣,在字串的末尾自動新增換行字符。必須自己新增該字元。
下面來說說一個新的模組——shelve
可以將Python 程式中的變數儲存到二進位制的shelf 檔案中。這樣,程式就可以從硬碟中恢復變數的資料。shelve 模組讓你在程式中新增“儲存”和“開啟”功能。例如,如果執行一個程式,並輸入了一些配置設定,就可以將這些設定儲存到一個shelf 檔案,然後讓程式下一次執行時載入它們。
我們就來看下是怎麼使用的
import shelve
shelfFile = shelve.open('mydata')
cats = ['Zophie', 'Pooka', 'Simon']
shelfFile['cats'] = cats
shelfFile.close()
這裡,我們的shelf 值儲存在shelfFile中。我們建立了一個列表cats,並寫下shelfFile['cats'] =cats,將該列表儲存在shelfFile 中,作為鍵'cats'關聯的值(就像在字典中一樣)。
在Windows 上執行前面的程式碼,你會看到在當前工作目錄下有3 個新檔案:mydata.bak、mydata.dat 和mydata.dir。
在OS X 上,只會建立一個mydata.db 檔案。
這些二進位制檔案包含了儲存在shelf 中的資料。這些二進位制檔案的格式並不重要,你只需要知道shelve 模組做了什麼,而不必知道它是怎麼做的。該模組讓你不用操心如何將程式的資料儲存到檔案中。
你的程式稍後可以使用shelve 模組,重新開啟這些檔案並取出資料。shelf 值不必用讀模式或寫模式開啟,因為它們在開啟後,既能讀又能寫。
shelfFile = shelve.open('mydata')
>>> type(shelfFile)
<class 'shelve.DbfilenameShelf'>
>>> shelfFile['cats']
['Zophie', 'Pooka', 'Simon']
>>> shelfFile.close()
像字典一樣,shelf 值有keys()和values()方法,返回shelf 中鍵和值的類似列表的值。因為這些方法返回類似列表的值,而不是真正的列表,所以應該將它們傳遞給list()函式,取得列表的形式。
>>> shelfFile = shelve.open('mydata')
>>> list(shelfFile.keys())
['cats']
>>> list(shelfFile.values())
[['Zophie', 'Pooka', 'Simon']]
>>> shelfFile.close()
還有一種方式可以用來儲存變數
pprint.pformat()函式將返回文字字串,但不是列印它。這個字串不僅是易於閱讀的格式,同時也是語法上正確的Python 程式碼。假定你有一個字典,儲存在一個變數中,你希望儲存這個變數和它的內容,以便將來使用。
pprint.pformat()函式將提供一個字串,你可以將它寫入.py 檔案。該檔案將成為你自己的模組,如果你需要使用儲存在其中的變數,就可以匯入它。
例如,在互動式環境中輸入以下程式碼:
>>> import pprint
>>> cats = [{'name': 'Zophie', 'desc': 'chubby'}, {'name': 'Pooka', 'desc': 'fluffy'}]
>>> pprint.pformat(cats)
"[{'desc': 'chubby', 'name': 'Zophie'}, {'desc': 'fluffy', 'name': 'Pooka'}]"
>>> fileObj = open('myCats.py', 'w')
>>> fileObj.write('cats = ' + pprint.pformat(cats) + '\n')
83
>>> fileObj.close()
這裡,我們匯入了pprint,以便能使用pprint.pformat()。我們有一個字典的列表,儲存在變數cats 中。為了讓cats 中的列表在關閉互動式環境後仍然可用,我們利用pprint.pformat(),將它返回為一個字串。當我們有了cats 中資料的字串形式,就很容易將該字串寫入一個檔案,我們將它命名為myCats.py。
import 語句匯入的模組本身就是Python 指令碼。如果來自pprint.pformat()的字元串儲存為一個.py 檔案,該檔案就是一個可以匯入的模組,像其他模組一樣。由於Python 指令碼本身也是帶有.py 副檔名的文字檔案,所以你的Python 程序甚至可以生成其他Python 程式。然後可以將這些檔案匯入到指令碼中。