CrazyWing:Python自動化運維開發實戰 十3、Python文件I/O

打開和關閉文件:

能夠用 file 對象作大部分的文件操做。 python

open 函數:

先用open()函數打開一個文件,建立一個file對象,再用相關的方法才能夠調用它進行讀寫。
open() 和 file() 功能相同, 能夠任意替換。
任何使用 open() 的地方, 均可以使用 file() 替換它,建議用open()linux

語法: 程序員

file object = open(file_name [, access_mode][, buffering])

參數說明: 緩存

file_name:      
file_name變量是一個包含了你要訪問的文件名稱的字符串值。

access_mode:
決定打開文件的模式:只讀,寫入,追加等,全部可取值見後面的徹底列表,這個參數是非強制的
默認文件訪問模式爲只讀(r).一般, 文件使用模式 'r', 'w', 或是 'a'模式來打開, 分別表明讀取, 寫入
和追加

buffering:         
    若是buffering的值被設爲0,就不會有寄存。
    若是buffering的值取1,訪問文件時會寄存行。
    若是將buffering的值設爲大於1的整數,代表這就是的寄存區的緩衝大小。
    若是取負值,寄存區的緩衝大小則爲系統默認。

    例1.
    >>> f = open('c.txt','w',0)     #沒有緩衝
    >>> f.write('hello world')       #close以前打開另外一終端觀察文件發現已經寫入進
                                                     去,說明關閉文件以前就已經寫到硬盤
    >>> f.close()

    例2.    
    >>> f = open('d.txt','w',1)     #有緩衝
    >>> f.write('hello world')       #close以前打開另外一終端觀察文件發現沒有寫入進 
                                                    去,說明關閉文件以前沒有寫到硬盤
    >>> f.close()

    例3.   
    >>> f = open('e.txt','w',5)     #設置緩衝區大小,wing發現沒有管用,跟沒有緩衝
                                                    效果是同樣的
    >>> f.write('hello world')

    例4.   
    >>> f = open('f.txt','w',-1)     #設置緩存區大小爲默認,發現有緩衝
    >>> f.write('hello world')
    >>> f.close()
    通常狀況下緩衝使用系統默認方式便可.

不一樣模式打開文件的徹底列表: ide

| 模式 | 描述 |
| r | 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。以這種模式打開的文件必須是已經存在的(U模式也是) |
| rb | 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。 |
| r+ | 打開一個文件用於讀寫。文件指針將會放在文件的開頭。注意這個模式默認是帶緩衝的 |
| rb+ | 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
| w | 打開一個文件只用於寫入。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。 |
| wb | 以二進制格式打開一個文件只用於寫入。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。 |
| w+ | 打開一個文件用於讀寫。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。 |
| wb+ | 以二進制格式打開一個文件用於讀寫。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。 |
| a | 打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後即便你 seek 到了其它的地方。若是該文件不存在,建立新文件進行寫入。 |
| ab | 以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。 |
| a+ | 打開一個文件用於讀寫。若是該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。若是該文件不存在,建立新文件用於讀寫。 |
| ab+ | 以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。若是該文件不存在,建立新文件用於讀寫。 |

通用換行符支持(UNS):函數

還有一個特殊的模式U,不一樣平臺用來表示行結束的符號是不一樣的, 例如 \n, \r, 或者 \r\n.當你使用 'U' 標誌打開文件的時候, 全部的行分割符(或行結束符, 不管它原來是什麼)經過 Python 的輸入方法(例如 read*() )返回時都會被替換爲換行符 NEWLINE(\n).注意 UNS 只用於讀取文本文件. 沒有對應的處理文件輸出的方法.
 可使用U,rU或Ua模式打開文件

關於 'b' 的說明:spa

對於全部 POSIX 兼容的 Unix 系統(包括Linux)來講, 'b'是可由可無的, 由於它們把全部的文件看成二進制文件, 包括文本文件. 
下面是從 Linux 手冊的 fopen() 函數使用中摘錄的一段, Python 語言中的 open() 函數就是從它衍生出的:
指示文件打開模式的字符串中也能夠包含字符 "b" , 但它不能作爲第一個字符出現.
這樣作的目的是爲了嚴格地知足 ANSI C3.159-1989 (即 ANSI C)中的規定。
事實上它沒有任何效果, 全部POSIX 兼容系統, 包括 Linux , 都會忽略 "b" ,其它系統可能會區分文本文件和二進制文件, 若是你要處理一個二進制文件, 並但願你的程序能夠移植到其它非 Unix 的環境中, 加上"b" 會是不錯的主意

File對象的屬性

一個文件被打開後,你就會擁有一個file對象,你能夠獲得有關該文件的各類信息。 指針

file對象屬性列表: code

| 屬性 | 描述 |
| file.closed | 返回true若是文件已被關閉,不然返回false。 |
| file.mode | 返回被打開文件的訪問模式。 |
| file.name | 返回文件的名稱。 |
| file.softspace | 若是用print輸出後,必須跟一個空格符,則返回false。不然返回true。通常程序員用不着,由程序內部使用。 |

例: 對象

#!/usr/bin/python
#打開一個文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
print "是否已關閉 : ", fo.closed
print "訪問模式 : ", fo.mode
print "末尾是否強制加空格 : ", fo.softspace 

輸出結果: 
文件名:  foo.txt
是否已關閉 :  False
訪問模式 :  w
末尾是否強制加空格 :  0

close()方法:

File 對象的 close()方法刷新緩衝區裏任何還沒寫入的信息,並關閉該文件,這以後便不能再進行寫入。 
當一個文件對象的引用被從新指定給另外一個文件時,Python 會關閉以前的文件

語法: 
    fileObject.close() 
例: 
    #!/usr/bin/python
    fo = open("foo.txt", "w")
    print "文件名: ", fo.name    
    fo.close()      # 關閉打開的文件

    輸出結果: 
    文件名:  foo.txt

讀文件方法: read() readline() readlines()

read():返回字符串

從一個打開的文件中讀取一個字符串。
fileObject.read([count])
    被傳遞的參數count是要從已打開文件中讀取的字節計數。
該方法從文件的開頭開始讀入,若是沒有傳入count參數(默認值爲 -1)或者值爲負, 文件將被
讀取到末尾.

 #!/usr/bin/python
 fo = open("foo.txt", "r+")
 str = fo.read(10);
 print "讀取的字符串是 : ", str
 fo.close() 

 輸出結果: 
 讀取的字符串是 :  www.fklinu

readline():返回字符串

讀取下個行結束符以前的全部字節. 做爲字符串返回整行,包括行結束符。
和 read() 相同, 它也有一個可選的 size 參數, 默認爲 -1, 表明讀至行結束符, 若是
提供了該參數, 那麼在超過 size 個字節後會返回不完整的行.

readlines():返回字符串列表

讀取全部剩餘的行,返回一個字符串列表。

寫文件方法:write() writelines()

write()

可將任何字符串(包括二進制數據)寫入一個打開的文件,不會在字符串的結尾添加換行符('\n')

writelines()

是針對列表的操做, 它接受一個字符串序列(字符串,字符串列表,字符串元組)做爲參數, 將它們寫入文件. 行結束符並不會被自動加入, 因此若是須要的話, 你必須在調用writelines()前給每行結尾加上行結束符.

語法:
fileObject.write(string)
string參數是要寫入到已打開文件的內容。

#!/usr/bin/python
 fo = open("foo.txt", "w")
 fo.write( "www.fklinux.com!\nVery good site!\n");    
 fo.close() # 關閉打開的文件

被建立的foo.txt文件內容: 
 # cat foo.txt 
 www.fklinux.com!
 Very good site!

文件內移動:

tell()方法:

這個方法告訴咱們文件內的當前位置,換句話說,下一次的讀寫會發生在文件開頭這麼多字節之
後。

seek()方法:

能夠在文件中移動文件指針到不一樣的位置. 
語法:
seek(offset [,from])

offset變量表示要移動的字節數
from變量指定開始移動字節的參考位置。 
    若是from被設爲0,這意味着將文件的開頭做爲移動字節的參考位置
    若是設爲1,則使用當前的位置做爲參考位置
    若是設爲2,那麼該文件的末尾將做爲參考位置 

seek配置r+模式能夠實現從指定位置修改文件

例:
就用上面建立的文件foo.txt。
#!/usr/bin/python
fo = open("foo.txt", "r+")
str = fo.read(10);
print "讀取的字符串是 : ", str

# 查找當前位置
 position = fo.tell();
 print "當前文件位置 : ", position

 # 把指針再次從新定位到文件開頭
 position = fo.seek(0, 0);
 str = fo.read(10);
 print "從新讀取字符串 : ", str
 # 關閉打開的文件
 fo.close() 

 輸出結果: 
 讀取的字符串是 :  www.fklinu
 當前文件位置 :  10
 從新讀取字符串 :  www.fklinu

文件迭代:
一行一行訪問文件很簡單:
for eachLine in f:
:

此循環裏, eachLine 表明文本文件的一行(包括末尾的行結束符),你可使用它作任何想作的事情.
在 Python 2.2 中, 引進了迭代器和文件迭代,  文件對象成爲了它們本身的迭代器
意味着用戶沒必要調用 read*() 方法就能夠在 for 循環中迭代文件的每一行.
另外也可以使用迭代器的 next 方法, file.next() 能夠用來讀取文件的下一行.
和其它迭代器同樣, Python 也會在全部行迭代完成後引起 StopIteration 異常.

迭代器以前的老方法:
for eachLine in f.readline():
    :

其餘:

flush() 方法
會直接把內部緩衝區中的數據馬上寫入文件, 而不是被動地等待輸出緩衝區被寫入.
truncate() 方法
將文件截取到當前文件指針位置或者到給定 size , 以字節爲單位.
它接受一個可選的 size 做爲參數. 若是給定, 那麼文件將被截取到最多 size 字節處. 若是沒有傳遞 size 參數, 那麼默認將截取到文件的當前位置.例如, 你剛打開了一個文件, 而後當即調用 truncate() 方法, 那麼你的文件(內容)實際上被刪除,這時候你是實際上是從 0 字節開始截取的

重命名和刪除文件

Python的os模塊提供了幫你執行文件處理操做的方法,好比重命名和刪除文件。

rename()方法:
須要兩個參數,當前的文件名和新文件名。
語法:
os.rename(current_file_name, new_file_name)

例子: 下例將重命名一個已經存在的文件test1.txt。
#!/usr/bin/python
import os
os.rename( "test1.txt", "test2.txt" ) # 重命名文件test1.txt到test2.txt。

remove()方法:
你能夠用remove()方法刪除文件,須要提供要刪除的文件名做爲參數。
語法:
os.remove(file_name)

例子: 下例將刪除一個已經存在的文件test2.txt。
#!/usr/bin/python
import os
os.remove("test2.txt") # 刪除一個已經存在的文件test2.txt

Python裏的目錄:

os模塊有許多方法能幫你建立,刪除和更改目錄。

mkdir()方法:
使用os模塊的mkdir()方法在當前目錄下建立新的目錄們。你須要提供一個包含了要建立的目錄名稱的參數。
語法:
os.mkdir("newdir")
例子: 下例將在當前目錄下建立一個新目錄test。
#!/usr/bin/python
import os
os.mkdir("test") # 建立目錄test

chdir()方法:
能夠用chdir()方法來改變當前的目錄。chdir()方法須要的一個參數是你想設成當前目錄的目錄名稱。
語法:
os.chdir("newdir")
例子: 下例將進入"/home/newdir"目錄。
#!/usr/bin/python
import os
os.chdir("/home/newdir") # 將當前目錄改成"/home/newdir"

getcwd()方法:
getcwd()方法顯示當前的工做目錄。
語法:
os.getcwd()
例子: 下例給出當前目錄:
#!/usr/bin/python
import os
os.getcwd() # 給出當前的目錄

rmdir()方法 :rmdir()方法刪除目錄,目錄名稱以參數傳遞。 在刪除這個目錄以前,它的全部內容應該先被清除。 語法: os.rmdir('dirname') 例子: 如下是刪除" /tmp/test"目錄的例子,目錄的徹底合規名稱必須被給出,不然會在當前目錄下搜索該目錄。 #!/usr/bin/pythonimport osos.rmdir( "/tmp/test" ) # 刪除」/tmp/test」目錄

相關文章
相關標籤/搜索