python基礎3:文件運算操作

一、常用文件運算:

運算操作 描述
F.read([size]) 讀取字節長度爲size的內容。size爲讀取的長度,以byte爲單位
F.readline([size]) 讀一行,如果定義了size,有可能返回的只是一行的一部分
F.readlines([size]) 把文件每一行作爲一個list的一個成員,並返回這個list。其實它的內部是通過循環調用readline()來實現的。如果提供size參數,size是表示讀取內容的總長,也就是說可能只讀到文件的一部分。
F.write(str) 把str寫到文件中,write()並不會在str後加上一個換行符
F.writelines(seq) 把seq的內容全部寫到文件中。這個函數也只是忠實地寫入,不會在每行後面加上任何東西。
F.close() 關閉文件。python會在一個文件不用後自動關閉文件,不過這一功能沒有保證,最好還是養成自己關閉的習慣。如果一個文件在關閉後還對其進行操作會產生ValueError
F.flush() 把緩衝區的內容寫入硬盤
F.fileno() 返回一個長整型的”文件標籤“
F.isatty() 文件是否是一個終端設備文件(unix系統中的)
F.tell() 返回文件操作標記的當前位置,即當前位置的指針偏移量以文件的開頭爲原點
F.next() 返回下一行,並將文件操作標記位移到下一行。把一個file用於for … in file這樣的語句時,就是調用next()函數來實現遍歷的。
F.seek(offset[,whence]) 將文件打操作標記移到offset的位置。這個offset一般是相對於文件的開頭來計算的,一般爲正數。但如果提供了whence參數就不一定了,whence可以爲0表示從頭開始計算,1表示以當前位置爲原點計算,2表示以文件末尾爲原點進行計算(當前位置僅對於二進制模式(open(‘test.txt’, ‘rb’))讀取有效)。需要注意,如果文件以a或a+的模式打開,每次進行寫操作時,文件操作標記會自動返回到文件末尾。另外,對於非二進制模式讀取的文件,whence只能爲0,即只能以文件起始位置作爲偏移定位的原點
F.truncate([size]) 把文件裁成規定的大小,默認的是裁到當前文件操作標記的位置。如果size比文件的大小還要大,依據系統的不同可能是不改變文件,也可能是用0把文件補到相應的大小,也可能是以一些隨機的內容加上去。
open(‘f.txt’, encoding=’latin-1’) python3.0 Unicode文本文件(str字符串)
open(‘f.txt’, ‘rb’) python3.0 二進制byte文件(bytes字符串)

關於open函數,其處理模式如下:

模式字符串 描述
w 以寫方式打開,如果文件不存在則創建文件
a 以文件尾部追加寫入內容模式打開 (從 EOF 開始, 必要時創建新文件)
r+ 以讀寫模式打開
w+ 以讀寫模式打開 (參見 w )
a+ 以讀寫模式打開 (參見 a )
rb 以二進制讀模式打開
wb 以二進制寫模式打開 (參見 w )
ab 以二進制追加模式打開 (參見 a )
rb+ 以二進制讀寫模式打開 (參見 r+ )
wb+ 以二進制讀寫模式打開 (參見 w+ )
ab+ 以二進制讀寫模式打開 (參見 a+ )

二、Python讀寫文件運算

1.打開文件: open函數
使用open打開文件後一定要記得調用文件對象的close()方法。比如可以用try/finally語句來確保最後能關閉文件。
不過,用with open(f, ‘w/…’) as f: 方式不需要調用close()方法,推薦使用該方式。

file_object = open('thefile.txt')
try:
     all_the_text = file_object.read( )
finally:
     file_object.close( )
# 注:不能把open語句放在try塊裏,因爲當打開文件出現異常時,文件對象file_object無法執行close()方法。
with open('test.txt', 'rb') as f:
    # 以文件起始位置作爲相對位置,偏移8個字節長度
    f.seek(8, 0)
    # 輸出當前指針偏移量
    pos = f.tell()
    print(pos)          # 8
    # 讀取8個字節長度的文本,範圍爲[8,16)
    text_to_number = f.read(8)
    print(text_to_number)       # b'BBBBBBBB'

2.讀文件
~~讀文本文件

    input = open('data', 'r')
    #第二個參數默認爲r
    input = open('data')

~~讀二進制文件

    input = open('data', 'rb')

~~讀取所有內容

    file_object = open('thefile.txt')
    try:
         all_the_text = file_object.read( )
    finally:
         file_object.close( )

~~讀固定字節 !!!!!!!!!!!!!!!!!!! 記住語法格式!!!!!!!!!!!!!!!

file_object = open('abinfile', 'rb')
try:
    while True:
        chunk = file_object.read(100)
        if not chunk:
            break
        do_something_with(chunk)
finally:
     file_object.close( )

with open('abinfile', 'rb') as f:           # rb: 作爲二進制文件讀取
    while True:
        chunk = file_object.read(100)       # 當讀文件到結尾處是,跳出循環
        if not chunk:
            break
        do_something_with(chunk)

~~讀每行

    list_of_all_the_lines = file_object.readlines( )

~~遍歷每行:如果文件是文本文件,還可以直接遍歷文件對象獲取每行:

    for line in file_object:
         process line

3.寫文件
寫文本文件

    output = open('data', 'w')

寫二進制文件

    output = open('data', 'wb')

追加寫文件

    output = open('data', 'a+')

寫數據

    file_object = open('thefile.txt', 'w')
    file_object.write(all_the_text)
    file_object.close( )

寫入多行

    file_object.writelines(list_of_text_strings)

注意,調用writelines寫入多行在性能上會比使用write一次性寫入要高。

在處理日誌文件的時候,常常會遇到這樣的情況:日誌文件巨大,不可能一次性把整個文件讀入到內存中進行處理,例如需要在一臺物理內存爲 2GB 的機器上處理一個 2GB 的日誌文件,我們可能希望每次只處理其中 200MB 的內容。
在 Python 中,內置的 File 對象直接提供了一個 readlines(sizehint) 函數來完成這樣的事情。以下面的代碼爲例:

file = open('test.log', 'r')
sizehint = 209715200   # 200M
position = 0
lines = file.readlines(sizehint)
while not file.tell() - position < 0:       
    position = file.tell()       
    lines = file.readlines(sizehint)

每次調用 readlines(sizehint) 函數,會返回大約 200MB 的數據,而且所返回的必然都是完整的行數據,大多數情況下,返回的數據的字節數會稍微比 sizehint 指定的值大一點(除最後一次調用 readlines(sizehint) 函數的時候)。通常情況下,Python 會自動將用戶指定的 sizehint 的值調整成內部緩存大小的整數倍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章