1. 程式人生 > 實用技巧 >Python Linux系統管理之檔案讀寫

Python Linux系統管理之檔案讀寫

準備工作

1、安裝Ipython(請見”Ipython的安裝”)

2、實驗用的文件(你自己用vi編輯器建立檔案就好了)

一、Python內建的Open函式

在Python中,要對應檔案進行操作,只要使用內建的Open函式開啟檔案即可。Open函式接受檔名和開啟模式作為引數,返回一個檔案物件。工程師通過檔案物件來操作檔案,完成以後,呼叫檔案物件的close方法關閉檔案即可。

例如,在當前目錄下有一個名為data的檔案,它的內容如下:

[root@master ~]# cat data 
Beautiful is better than ugly.
Explicit is
better 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)