溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python讀取文件中某幾行的方法

發(fā)布時間:2020-08-14 09:53:09 來源:億速云 閱讀:2781 作者:小新 欄目:編程語言

小編給大家分享一下python讀取文件中某幾行的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

python讀取文件的指定行,可以使用以下的方法

1、os.mknod(“test.txt”) #創(chuàng)建空文件

2、fp = open(“test.txt”,w) #直接打開一個文件,如果文件不存在則創(chuàng)建文件

3、open 模式

處理文件時,一個常見的需求就是讀取文件的指定行內(nèi)容,那么該如何實(shí)現(xiàn)的?

with open('a.log', 'r') as fp:
    lines = fp.readlines()
    last_line = lines[-1]

即使不考慮異常處理的問題,這個代碼也不完美,因?yàn)槿绻募艽?,lines = fp.readlines()會造成很大的時間和空間開銷。

解決的思路是用將文件指針定位到文件尾,然后從文件尾試探出一行的長度,從而讀取最后一行。代碼如下:

def __get_last_line(self, filename):
    """
    get last line of a file
    :param filename: file name
    :return: last line or None for empty file
    """
    try:
        filesize = os.path.getsize(filename)
        if filesize == 0:
            return None
        else:
            with open(filename, 'rb') as fp: # to use seek from end, must use mode 'rb'
                offset = -8                 # initialize offset
                while -offset < filesize:   # offset cannot exceed file size
                    fp.seek(offset, 2) #read#offset chars from eof(represent by number'2')
                    lines = fp.readlines()  # read from fp to eof
                    if len(lines) >= 2:     # if contains at least 2 lines
                        return lines[-1]    # then last line is totally included
                    else:
                        offset *= 2         # enlarge offset
                fp.seek(0)
                lines = fp.readlines()
                return lines[-1]
    except FileNotFoundError:
        print(filename + ' not found!')
        return None

其中有幾個注意點(diǎn):

1. fp.seek(offset[, where])中where=0,1,2分別表示從文件頭,當(dāng)前指針位置,文件尾偏移,缺省值為0,但是如果要指定where=2,文件打開的方式必須是二進(jìn)制打開,即使用'rb'模式,

2. 設(shè)置偏移量時注意不要超過文件總的字節(jié)數(shù),否則會報(bào)OSError,

3. 注意邊界條件的處理,比如文件只有一行的情況。

更多學(xué)習(xí)內(nèi)容,請點(diǎn)擊python學(xué)習(xí)網(wǎng)。

fp.read([size]) #size為讀取的長度,以byte為單位

fp.readline([size]) #讀一行,如果定義了size,有可能返回的只是一行的一部分

fp.readlines([size]) #把文件每一行作為一個list的一個成員,并返回這個list。其實(shí)它的內(nèi)部是通過循環(huán)調(diào)用readline()來實(shí)現(xiàn)的。如果提供size參數(shù),size是表示讀取內(nèi)容的總長,也就是說可能只讀到文件的一部分。

fp.write(str) #把str寫到文件中,write()并不會在str后加上一個換行符

fp.writelines(seq) #把seq的內(nèi)容全部寫到文件中(多行一次性寫入)。這個函數(shù)也只是忠實(shí)地寫入,不會在每行后面加上任何東西。

fp.close() #關(guān)閉文件。python會在一個文件不用后自動關(guān)閉文件,不過這一功能沒有保證,最好還是養(yǎng)成自己關(guān)閉的習(xí)慣。 如果一個文件在關(guān)閉后還對其進(jìn)行操作會產(chǎn)生ValueError

fp.flush() #把緩沖區(qū)的內(nèi)容寫入硬盤

fp.fileno() #返回一個長整型的”文件標(biāo)簽“

fp.isatty() #文件是否是一個終端設(shè)備文件(unix系統(tǒng)中的)

fp.tell() #返回文件操作標(biāo)記的當(dāng)前位置,以文件的開頭為原點(diǎn)

fp.next() #返回下一行,并將文件操作標(biāo)記位移到下一行。把一個file用于for … in file這樣的語句時,就是調(diào)用next()函數(shù)來實(shí)現(xiàn)遍歷的。

fp.seek(offset[,whence]) #將文件打操作標(biāo)記移到offset的位置。這個offset一般是相對于文件的開頭來計(jì)算的,一般為正數(shù)。但如果提供了whence參數(shù)就不一定了,whence可以為0表示從頭開始計(jì)算,1表示以當(dāng)前位置為原點(diǎn)計(jì)算。2表示以文件末尾為原點(diǎn)進(jìn)行計(jì)算。需要注意,如果文件以a或a+的模式打開,每次進(jìn)行寫操作時,文件操作標(biāo)記會自動返回到文件末尾。

fp.truncate([size]) #把文件裁成規(guī)定的大小,默認(rèn)的是裁到當(dāng)前文件操作標(biāo)記的位置。如果size比文件的大小還要大,依據(jù)系統(tǒng)的不同可能是不改變文件,也可能是用0把文件補(bǔ)到相應(yīng)的大小,也可能是以一些隨機(jī)的內(nèi)容加上去。

以上是python讀取文件中某幾行的方法的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI