Python Linux系統管理之檔案讀寫
準備工作
1、安裝Ipython(請見”Ipython的安裝”)
2、實驗用的文件(你自己用vi編輯器建立檔案就好了)
一、Python內建的Open函式
在Python中,要對應檔案進行操作,只要使用內建的Open函式開啟檔案即可。Open函式接受檔名和開啟模式作為引數,返回一個檔案物件。工程師通過檔案物件來操作檔案,完成以後,呼叫檔案物件的close方法關閉檔案即可。
例如,在當前目錄下有一個名為data的檔案,它的內容如下:
[root@master ~]# cat data Beautiful is better than ugly. Explicit isbetter than implicit. Simple is better than complex. Complex is better than complicated.
接下來,使用Open函式開啟檔案,呼叫檔案物件的read方法讀取檔案的所有內容,完成以後,呼叫檔案物件的close方法關閉檔案,如下所示:
In [3]: f = open('data') In [4]: print(f.read()) Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. In [5]: f.close()
與其他程式語言類似,open函式預設以’r’模式開啟,也可以指定檔案的開啟模式,如表所示。
表 檔案的開啟模式
下面程式碼分別演示,開啟一個不存在的檔案時’w’模式與’x’模式的區別:
In [7]: f = open('data1.txt','w') In [8]: f.write('Hello World') Out[8]: 11 In [9]: f.close() In [10]: f = open('data1.txt','x') --------------------------------------------------------------------------- FileExistsError Traceback (most recent call last) <ipython-input-10-fc8069bb2b02> in <module> ----> 1 f = open('data1.txt','x') FileExistsError: [Errno 17] File exists: 'data1.txt' In [11]: In [11]:
In [11]: f = open('data2.txt','x') In [12]: f.write('Hello World') Out[12]: 11 In [13]: In [13]: f.close() In [14]:
二、避免檔案控制代碼洩露
在計算機程式中,每開啟一個檔案就需要佔用一個檔案控制代碼,而一個程序擁有檔案的控制代碼是有限的。此外,檔案控制代碼也會佔用作業系統的資源,因此,在編寫程式處理檔案時需要注意,檔案處理結束後及時關閉檔案。檔案控制代碼洩露或許是最常見的資源洩露問題,用finally關閉檔案控制代碼。在Python中,也可以使用finally語句來保證,無論在什麼情況下檔案都會被關閉,如下所示:
try: f = open(‘data.txt’) print(f.read()) finally: f.close()
Python中還有更加簡潔優美的寫法,即使用上下文管理器。雖然使用finally語句能夠保證資源一定關閉,但是沒有上下文管理器簡潔好用。如果工程師可以在上下文管理器的情況下,使用了Finally語句,將會認為程式碼寫的不夠Pythonic。對於檔案開啟、處理、再關閉的邏輯,使用上下文管理器程式碼如下:
with open(‘data.txt’) as f: print(f.read()) |
可以看到,使用上下文管理器以後程式碼行數變少了。在Python中,如果想想把程式碼寫的簡潔優美,就應該在保證可讀性的前提下程式碼行數越少越好。
三、常見的檔案操作函式
Python的檔案物件有多重型別的函式,如重新整理快取的flush函式,獲取檔案位置的tell函式,改變檔案讀取偏移量的seek函式。但是,工作中使用最多的還是與讀寫相關的函式。下面來看幾個Python中的讀寫函式。
Python提供了三個讀相關的函式,分別是read、readline和readlines,他們的作用如下:
- read:讀取檔案中的所有內容;
- readline:一次讀取一行;
- readlines:將檔案內容存到一個列表中,列表中的每一行對應於檔案中的每一行。
我們可以使用上邊的”data.txt”檔案,分別測試這三個讀函式的效果:
In [1]: f = open(‘data.txt’) In [2]: f.read() Out[2]: ‘Beautiful is better than ugly.\nExplicit is better than implicit.\nSimple is better than complex.\nComplex is better than complicated.\n’ In [3]: f.seek(0) Out[3]: 0 In [4]: f.readline() Out[4]: ‘Beautiful is better than ugly.\n’ In [5]: f.seek(0) Out[5]: 0 In [6]: f.readlines() Out[6]: [‘Beautiful is better than ugly.\n’, ‘Explicit is better than implicit.\n’, ‘Simple is better than complex.\n’, ‘Complex is better than complicated.\n’] |
這裡可以看到,read和readlines函式都是一次就將所有內容讀入記憶體中,對於檔案較小的情況不會有什麼問題。但是,如果處理的是大檔案,這種使用方法會佔用大量的記憶體,甚至有可能因為記憶體佔用太多出現Out-Of-Memory錯誤。
Python提供了兩個寫函式,分別是write和writelines,他們的區別如下:
- write:寫字串到檔案中,並返回寫入的字串;
- writelines:寫一個字串列表到檔案中。
依然使用Ipython對檔案物件的寫入函式進行測試,並在寫入完成以後使用Linux的cat命令檢視檔案內容:
In [1]: f = open(‘data.txt’,’w’) In [2]: f.write(‘Beautiful is better than ugly.’) Out[2]: 30 In [3]: f.writelines([‘Explicit is better than implicit.’,’Simple is better than complex.’]) cat data.txt |
在Python中,除了使用檔案物件的write函式和writelines函式向檔案寫入資料以外,也可以使用print函式將輸出結果輸出到檔案中。print函式比write和writelines函式更加靈活,如下所示:
From __fureture__ import print_function With open(‘data.txt’,’w’)as f: print(1,2,’hello world’,sep”,”.file=f) |