1. 程式人生 > >python的檔案操作file:(內建函式,如seek、truncate函式)

python的檔案操作file:(內建函式,如seek、truncate函式)

file開啟檔案有兩種方式,函式用file()或者open()。開啟後讀入檔案的內容用read()函式,其讀入是從檔案當前指標位置開始,所以需要控制指標位置用:

一、先介紹下file讀入的控制函式:

seek(offset,where): where=0從起始位置移動,1從當前位置移動,2從結束位置移動。當有換行時,會被換行截斷。seek()無返回值,故值為None。

# 將檔案打操作標記移到offset的位置。這個offset一般是相對於檔案的開頭來計算的,一般為正數。但如果提供了where引數就不一定了, where可以為0表示從頭開始計算,1表示以當前位置為原點計算。2表示以檔案末尾為原點進行計算。需要注意,如果檔案以a或a+的模式開啟,每次進行寫操作時,檔案操作標記會自動返回到檔案末尾。
            seek()的三種模式:

(1)f.seek(p,0) 移動當檔案第p個位元組處,絕對位置

(2)f.seek(p,1) 移動到相對於當前位置之後的p個位元組

(3)f.seek(p,2) 移動到相對文章尾之後的p個位元組

for instance:

    inputfile= file('g:\\observer_report_20130915155111')
    #for line in filecontent.readline():
    #print inputfile.readline()
    #print inputfile.tell()
    #print inputfile.seek(0,0)
    #print inputfile.tell() 

tell(): 返回檔案的當前位置,即檔案指標當前位置,以檔案開頭為原點,受seek、readline、read、readlines影響,不受truncate影響

truncate(n): 從檔案的首行首字元開始截斷,截斷檔案為n個字元;無n表示從當前位置起截斷;截斷之後n後面的所有字元被刪除。其中win下的換行代表2個字元大小。

  注意:truncate()這個函式跟檔案指標位置無關。每次執行都是從檔案開始處執行,也就是seek(0,0)的位置開始,擷取指定引數的n個字元,其它的全部刪除。所以要用a+(a不行)或是r+。如果用w+模式會讀出空,因為w是先刪除再寫,一定不要用。執行結果為,只剩檔案開頭的n個字元。

read()讀入所有行內容

readline(n):n為空時讀入一行,預設讀入當前行,開始讀取的位置為tell()+1。n為一行中讀入的位元組數,不滿一行的就取出部分(當前行的前n個字元),超出一行的只讀一行。

readlines()讀入所有行內容,按行讀入,讀入的內容為一行行。

另外,注意,新python,加入兩個函式xreadline()和xreadlines(),其將讀入的行作為類似列表的獨立物件,返回的行可以獨立按物件進行相關操作。

二、以下以1個例子說明以上各個函式的作用

fso = open("f:\\a.txt",'w+') '以w+方式,並非a方式開啟檔案,故檔案原內容被清空
print fso.tell() '檔案原內容被清空,故此時tell()=0

fso.write("abcde\n") '寫入檔案abcde\n,因為換行\n佔兩個字元,故共寫入7個字元
print fso.tell() '此時tell()=7

fso.write("fghwm") '又寫入檔案fghwm,故此時檔案共寫入7+5 =12個字元
print fso.tell() '此時tell()=12

fso.seek(1, 0) '從起始位置即檔案首行首字元開始移動1個字元
print fso.tell() ‘此時tell() =1

print fso.readline() '讀取當前行,即檔案的第1行,但是從第二個字元(tell()+1)開始讀,結果為:bcde。

'若換成for讀取整個檔案或read讀取整個檔案則結為bcdefghwm
print fso.tell() ‘因為readline此時tell() =7,

fso.truncate(8) '從寫入後文件的首行首字元開始階段,截斷為8個字元,即abcde\nf,即檔案的內容為:abcde\nf

print fso.tell() ‘tell() 依舊為7,併為受truncate(8)影響,但是此時檔案內容為abcde\nf

print fso.readline() ‘從tell()+1=8開始讀取,讀取當前行內容:f

fso.close()

#開啟檔案和進行寫操作
f=open(‘test.txt’,'w’)
f.write(‘hello’)
f.writelines(['hi','haha'])#多行輸入
f.close()
#append data
f=open(‘test.txt’,'a’)
f.write(‘hello’)
f.writelines(['hi','haha'])
f.close()
#連續寫入後會自動關閉
open(‘test.txt’,'a’).write(‘11111\r\n’)
#把result裡的元素依次填到open函式裡去
result={‘hello’,'u’}
exec open(‘test.txt’) in result
#
selected = [] # temp list to hold matches
fp = open(‘test.txt’)
for line in fp.readlines(): # Py2.2 -> “for line in fp:”
selected.append(line)
del line # Cleanup transient variable
#
open(‘test.txt’).readlines()

file在是一個特殊的型別,用於外部檔案的操作。python中一切都是物件,file也不例外,file有file的方法和屬性。

建立一個file物件:* file(name[, mode[, buffering]])

file()函式:建立一個file物件,它有一個別名叫open(),更形象一些,它們是內建函式。引數是以字串的形式傳遞的。

name是檔案的名字。

mode 是開啟的模式,可選的值為r w a U,分別代表讀(預設) 寫 新增支援各種換行符的模式。用w或a模式開啟檔案的話,如果檔案不存在,那麼就自動建立。此外,用w模式開啟一個已經存在的檔案時,原有檔案的內容會被清空,因為一開始檔案的操作的標記是在檔案的開頭的,這時候進行寫操作,無疑會把原有的內容給抹掉。由於歷史的原因,換行符在不同的系統中有不同模式,比如 在 unix中是一個\n,而在windows中是‘\r\n’,用U模式開啟檔案,就是支援所有的換行模式,也就說‘\r’ ‘\n’ ‘\r\n’都可表示換行,會有一個tuple用來存貯這個檔案中用到過的換行符。不過,雖說換行有多種模式,讀到python中統一用\n代替。在模式 字元的後面,還可以加上+ b t這兩種標識,分別表示可以對檔案同時進行讀寫操作和用二進位制模式、文字模式(預設)開啟檔案。

buffering如果為0表示不緩衝;如果為1表示進行“行緩衝“;如果是一個大於1的數表示緩衝區的大小,應該是以位元組為單位的。

filfile的屬性主要有:

* closed #標記檔案是否已經關閉,由close()改寫
* encoding #檔案編碼
* mode #開啟模式
* name #檔名
* newlines #檔案中用到的換行模式,是一個tuple
* softspace #boolean型,一般為0,據說用於print

file的其他方法:

* F.close()
#關閉檔案。python會在一個檔案不用後自動關閉檔案,不過這一功能沒有保證,最好還是養成自己關閉的習慣。如果一個檔案在關閉後還對其進行操作會產生ValueError
* F.flush()
#把緩衝區的內容寫入硬碟
* F.fileno()
#返回一個長整型的”檔案標籤“
* F.isatty()
#檔案是否是一個終端裝置檔案(unix系統中的)
* F.next()
#返回下一行,並將檔案操作標記位移到下一行。把一個file用於for … in file這樣的語句時,就是呼叫next()函式來實現遍歷的。