目錄結構:html
在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,獲取文件的名稱。python
在Windows操做系統中,文件能夠是圖像、文本、可執行、音頻、視頻等等文件格式。可是在python中,文件被分爲兩類:一類是文本文件,另外一類是二進制文件。文本文件由一行行的字符構成,每一行文本的末尾都有一個EOL字符(End Of Line Character)。EOL標誌着當前行的結束和新的一行的開始。二進制文件不一樣與文本文件,二進制文件也只能由知道文件格式的應用程序處理。linux
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參數指定了文件的打開模式,接下來筆者會詳細介紹它的全部取值。編程
Mode表明文件的打開模式,在上面介紹的open方法就須要用到文件的打開模式(Mode),open的參數中mode是可選的,下面的表闡述了Mode的取值。windows
模式 | 描述 |
r | 以只讀的方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。 |
rb | 以二進制格式打開一個文件只用於讀。文件指針將會放在文件的開頭。 |
r+ | 打開文件用於讀寫。文件指針將會放在文件的開頭。 |
rb+ | 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
w | 打開一個文件只用於寫入。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。 |
wb | 以二進制格式打開一個文件只用於寫入。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。 |
w+ | 打開一個文件用於讀寫。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。 |
wb+ | 以二進制格式打開一個文件用於讀寫。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。 |
a | 打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會寫入到已有的內容以後。若是該文件不存在,建立新文件進行寫入。 |
ab | 以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會寫入到已有的內容以後。若是該文件不存在,建立新文件進行寫入。 |
a+ | 打開一個文件用於讀寫。若是該文件已存在,文件指針將會放在文件的結尾。在文件打開時會使用追加模式。若是該文件不存在,建立新文件用於讀寫。 |
ab+ | 以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。若是該文件不存在,建立新文件用於讀寫。 |
下面是一個使用案例:app
f = open("test.txt","r") print(f) f.close()
在上面介紹過,open函數會返回一個文件對象(File Object)。一旦咱們拿到這個文件對象,就能夠調用這個對象上的屬性和方法了。最經常使用的方法就是read和write了。編輯器
爲了增長對文本文件的熟悉程度,接下來咱們將會建立本身的文本文件,而且在上面作一些練習。用一個文本編輯器,建立一個名爲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後,就能夠文件內容以下:ui
$ cat testfile.txt
Hello World
This is our new text file
and this is another line.
Why? Because we can.
讀取文件的內容的方式是多種多樣的,若是須要讀取一個文件中的全部的內容,那麼可使用read方法。this
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.’]
若是想要更有效率的循環文件中的每一行數據,那麼可使用循環語句,使用循環語句代碼不只簡單並且易讀。
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.
當完成對文件的操做後,就可使用close()方法關閉文件。它將會完全關閉文件,中斷正在使用資源,而且將這些資源返還給系統。
在使用完文件以後,記得要調用close()方法。在調用close()後,任何對文件對象(file object)的操做都是非法的。
在上面的全部案例中,咱們在每次使用完文件對象後都調用過close()方法,這是很是好的習慣。
能夠將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,
os模塊提供了許多與操做系統相交互的函數,OS是Python的標準組件模塊。該模塊提供了可移植性的文件操做方法。os和os.path模塊包含了許多可以與文件操做系統相交互的方法。
導入該模塊的操做系統的名稱,windows是nt,linux是posix
import os print(os.name) #windows是nt,linux是posix
輸出:
posix
os.getcwd()函數返回當前的工做目錄(Current Working Directory,CWD)
import os print(os.getcwd()) # 打印當前的絕對路徑 # os.path.abspath('.') # 打印當前路徑下的文件和文件夾 # os.listdir('.')
輸出:
/home/user/test
該方法會打開一個鏈接到命令行的管道,該管道的讀寫性依賴於打開模式。
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()
若是一個文件是使用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()重命名文件的名稱,被命名的文件必需存在並且用戶應該具備改變文件名稱的權限。
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'
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