目錄結構:
1.簡介
在Python中無需引入額外的模塊來進行文件操作,Python擁有內置的文件操作函數(除了內置文件操作函數,Python語言也提供了額外的文件操作模塊,它們具有更加強大的功能)。
os模塊提供了在操作系統上可移植的文件操作方法。如果只是想要讀取和寫入數據,那么可以用內置的open()方法。如果想要操作路徑,可以使用os.path模塊。如果想要在命令行上讀取所有的數據行,那么可以使用fileinput模塊。如果想要創建一個臨時文件或路徑,那么可以使用tempfile模塊。如果想要更高級別的文件和目錄操作,那么可以使用shutil模塊。
下面開始介紹內置的Open方法(在本文的后面還有關於os和fileinput模塊的講解):
首先需要用Python中的內置open函數獲得一個文件對象(file object)。
內置open函數可以直接打開一個文件(file),然后返回一個文件對象(file object),文件對象包含了的大量方法和屬性,可以用這些方法和屬性操作被打開的文件。
文件對象的closed屬性,表示一個文件是否關閉(如果已關閉返回True,否則返回False)。mode,獲取文件的打開模式。name,獲取文件的名稱。
2.Python中的文件類型
在Windows操作系統中,文件可以是圖像、文本、可執行、音頻、視頻等等文件格式。但是在python中,文件被分為兩類:一類是文本文件,另一類是二進制文件。文本文件由一行行的字符構成,每一行文本的末尾都有一個EOL字符(End Of Line Character)。EOL標志着當前行的結束和新的一行的開始。二進制文件不同與文本文件,二進制文件也只能由知道文件格式的應用程序處理。
3.內置函數的文件操作
3.1 open()函數
Python中的內置函數open會打開一個文件,並且返回一個文件對象。
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file:打開文件的路徑,必需提供。
mode:打開模式,默認為r(只讀訪問)
buffering:緩沖模式,值為0表示沒有緩沖,1表示行緩沖,大於1就表示緩沖區域的大小,負數表示默認為系統的緩沖區大小。設置了緩沖后,可以用flush()方法刷新緩沖。
encoding:文件的操作的編碼名稱
errors:一個可選字符串,指定如何處理編碼和解碼的錯誤
newline:控制換行符模式的行為
closefd:如果為false,那么應該傳入一個文件描述符(file descripter)而不應該傳入文件名稱。如果是True,那么必須傳入文件名稱。否則會出現錯誤。
opener:一個可調用對象,
上面的參數中只有file參數是必需提供的,mode參數指定了文件的打開模式,接下來筆者會詳細介紹它的所有取值。
3.2 Mode
Mode代表文件的打開模式,在上面介紹的open方法就需要用到文件的打開模式(Mode),open的參數中mode是可選的,下面的表闡述了Mode的取值。
模式 | 描述 |
r | 以只讀的方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。 |
rb | 以二進制格式打開一個文件只用於讀。文件指針將會放在文件的開頭。 |
r+ | 打開文件用於讀寫。文件指針將會放在文件的開頭。 |
rb+ | 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
w | 打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
wb | 以二進制格式打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
w+ | 打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
wb+ | 以二進制格式打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
a | 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會寫入到已有的內容之后。如果該文件不存在,創建新文件進行寫入。 |
ab | 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會寫入到已有的內容之后。如果該文件不存在,創建新文件進行寫入。 |
a+ | 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。在文件打開時會使用追加模式。如果該文件不存在,創建新文件用於讀寫。 |
ab+ | 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。 |
下面是一個使用案例:
f = open("test.txt","r") print(f) f.close()
在上面介紹過,open函數會返回一個文件對象(File Object)。一旦我們拿到這個文件對象,就可以調用這個對象上的屬性和方法了。最常用的方法就是read和write了。
3.3 創建文本文件
為了增加對文本文件的熟悉程度,接下來我們將會創建自己的文本文件,並且在上面做一些練習。用一個文本編輯器,創建一個名為testfile.txt的文件。然后在同一級目錄下,就可以使用如下的代碼進行文件寫入操作了
file = open(“testfile.txt”,”w”) file.write(“Hello World”) file.write(“This is our new text file”) file.write(“and this is another line.”) file.write(“Why? Because we can.”) file.close()
當我們打開testfile.txt后,就可以文件內容如下:
$ cat testfile.txt
Hello World
This is our new text file
and this is another line.
Why? Because we can.
3.4 讀取文本文件
讀取文件的內容的方式是多種多樣的,如果需要讀取一個文件中的所有的內容,那么可以使用read方法。
file = open(“testfile.txt”, “r”) print file.read() file.close()
你會看見testfile.txt的所有文件內容都會被輸出。
我們也可以只讀取指定數量的字符,只需要將需要讀取的字符數量傳遞給read方法便可以了。
file = open(“testfile.txt”, “r”) print file.read(5) file.close()
輸出:
Hello
如果想一行行的讀取文本文件的內容,那么可以使用readline方法。
file = open(“testfile.txt”, “r”) print file.readline() file.close()
輸出:
Hello World
如果想返回文件中的每行數據,那么可以使用readlines方法。
file = open(“testfile.txt”, “r”) print file.readlines() file.close()
輸出:
[‘Hello World’, ‘This is our new text file’, ‘and this is another line.’, ‘Why? Because we can.’]
3.5 循環文件對象
如果想要更有效率的循環文件中的每一行數據,那么可以使用循環語句,使用循環語句代碼不僅簡單而且易讀。
file = open(“testfile.txt”, “r”) for line in file: print line file.close()
輸出:
Hello World
This is our new text file
and this is another line.
Why? Because we can.
3.6 關閉文件
當完成對文件的操作后,就可以使用close()方法關閉文件。它將會徹底關閉文件,中斷正在使用資源,並且將這些資源返還給系統。
在使用完文件之后,記得要調用close()方法。在調用close()后,任何對文件對象(file object)的操作都是非法的。
在上面的所有案例中,我們在每次使用完文件對象后都調用過close()方法,這是非常好的習慣。
3.7 With語句
可以將with語句應用到文件對象(file object)上,使用with語句語法更清晰。使用with語句的優點在於任何打開的文件都會自動關閉,因此使用with不必擔心資源的釋放問題。
使用with語句打開文件的格式:
with open("filename") as file:
下面是一個完整的案例:
with open(“testfile.txt”) as file: data = file.read() //do something with data
在上面的案例代碼中,我們並沒有使用close()關閉文件對象。這是因為with語句會自動幫我們關閉,編程人員便可以更專注業務邏輯代碼。
下面是循環文件內容的案例:
with open(“testfile.txt”) as f: for line in f: print line,
4.os模塊
os模塊提供了許多與操作系統相交互的函數,OS是Python的標准組件模塊。該模塊提供了可移植性的文件操作方法。os和os.path模塊包含了許多能夠與文件操作系統相交互的方法。
os.name
導入該模塊的操作系統的名稱,windows是nt,linux是posix
import os print(os.name) #windows是nt,linux是posix
輸出:
posix
os.getcwd()
os.getcwd()函數返回當前的工作目錄(Current Working Directory,CWD)
import os print(os.getcwd()) # 打印當前的絕對路徑 # os.path.abspath('.') # 打印當前路徑下的文件和文件夾 # os.listdir('.')
輸出:
/home/user/test
os.popen()
該方法會打開一個連接到命令行的管道,該管道的讀寫性依賴於打開模式。
os.popen(command[, mode[, bufsize]])
mode(打開模式)和bufsize不是必須要提供的。如果為打開模式為提供,那么默認為"r",也就是只讀模式(read only)。
案例:
import os fd = "a.txt" # popen() 和 open() 相似 file = open(fd, 'w') file.write("Hello") file.close() file = open(fd, 'r') text = file.read() print(text) # popen() 提供了直接訪問文件的管道 file = os.popen(fd, 'w') file.write("Hello") # 其他的一些操作 # 關閉文件 file.close()
os.close()
如果一個文件是使用open()打開的,那么只能使用close()關閉。但是如果一個文件是通過os.popen()的,那么可以使用close()或os.close()方法。如果我們試圖用os.close()去關閉一個open()打開的文件,那么會拋出錯誤:
import os fd = "a.txt" file = open(fd, 'r') #使用open打開文件 text = file.read() print(text) os.close(file) #使用os.close()關閉文件
輸出:
Traceback (most recent call last):
File "/home/user/test/a.py", line 6, in
os.close(file)
TypeError: an integer is required (got type _io.TextIOWrapper)
os.rename()
可以使用os.rename()重命名文件的名稱,被命名的文件必需存在而且用戶應該具有改變文件名稱的權限。
import os fd = "a.txt" os.rename(fd,'New.txt') os.rename(fd,'New.txt')
輸出:
Traceback (most recent call last):
File "/home/user/test/a.py", line 3, in
os.rename(fd,'New.txt')
FileNotFoundError: [WinError 2] The system cannot find the
file specified: 'a.txt' -> 'New.txt'
5.fileInput模塊
fileinput模塊可以對一個或多個文件中的內容進行迭代、遍歷等操作。該模塊的input()函數有點類似文件readlines()方法,區別在於前者是一個迭代對象,需要用for循環迭代,后者是一次性讀取所有行。
用fileinput對文件進行循環遍歷,格式化輸出,查找、替換等操作,非常方便。
典型用法:
import fileinput for line in fileinput.input(): process(line)
基本格式:
fileinput.input([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])
參數說明:
files: #文件的路徑列表,默認是stdin方式,多文件['1.txt','2.txt',...]
inplace: #是否將標准輸出的結果寫回文件,默認為0不返回,設置為1時返回
backup: #備份文件的擴展名,只指定擴展名,如.bak。如果該文件的備份文件已存在,則會自動覆蓋。
bufsize: #緩沖區大小,默認為0,如果文件很大,可以修改此參數,一般默認即可
mode: #讀寫模式,默認為只讀
openhook: #該鈎子用於控制打開的所有文件,比如說編碼方式等;
常用函數
函數 | 描述 |
fileinput.input() | 返回能夠用於for循環遍歷的對象 |
fileinput.filename() | 返回當前文件的名稱 |
fileinput.lineno() | 返回當前已經讀取的行的數量(或者序號) |
fileinput.filelineno() | 返回當前讀取的行的行號 |
fileinput.isfirstline() | 檢查當前行是否是文件的第一行 |
fileinput.isstdin() | 判斷最后一行是否從stdin中讀取 |
fileinput.close() | 關閉隊列 |
#test.py #---樣本文件--- c:Python27>type 1.txt first second c:Python27>type 2.txt third fourth #---樣本文件--- import fileinput def process(line): return line.rstrip() + ' line' for line in fileinput.input(['1.txt','2.txt'],inplace=1): print process(line) #---結果輸出--- c:Python27>type 1.txt first line second line c:Python27>type 2.txt third line fourth line #---結果輸出---
參考文章:
https://www.pythonforbeginners.com/files/reading-and-writing-files-in-python
https://www.geeksforgeeks.org/os-module-python-examples/
https://www.2cto.com/kf/201412/361320.html