python3 讀取txt文字最後一行

2022-09-02 12:03:09 字數 3176 閱讀 5624

首先要理解txt文字都是實際由位元組組成的,比如對於乙個utf-8無bom編碼方式儲存的txt檔案,如果檔案內容為空,那麼該txt檔案大小為0位元組,乙個ascii字元佔乙個位元組,乙個中文字元佔3個位元組。

1q;付

比如utf-8無bom編碼方式儲存的txt檔案,文字內容如上,那麼該檔案的大小則為6位元組。

例子文字內容:

文字編碼:utf-8無bom

**:

out = open('新建文字文件.txt',encoding = 'utf-8')

lines = out.readlines()

print(lines)

forline

inlines:

print(bytes(line,encoding = 'utf-8'))

執行結果:

說明一下,如果最後一行是空行,那麼lines列表的最後乙個元素則是』333\n』。

可以看出readlines方法是一次讀取所有行存入list中,準確的說,是從當前的檔案指標讀到文字末尾。當然是r模式(讀模式)時,指標都是從0開始。

python3在使用readline和readlines方法時,會自動將windows下換行符\r\n變成\n。

如上同樣的文字。

執行如下**:

import os

out = open('新建文字文件.txt',encoding = 'utf-8')

lines = out.readlines()

print(lines)

forline

inlines:

print(bytes(line,encoding = 'utf-8'))

out = open('新建文字文件.txt','rb')#b,以二進位制形式讀取

print(out.read())

filesize = os.path.getsize('新建文字文件.txt')

print(filesize)

執行結果為:

21是檔案大小,21位元組。如果是從lines列表裡數字節大小,是7+4+4+3=18,為什麼實際上多了三個位元組呢,是因為python3對換行符進行了轉換,實際儲存的每個換行符還是\r\n。

所以,當你不是b模式下讀取文字時,換行符是『\n』,但當你是b模式讀取檔案時(且平台是windows),不管是read函式還是readlines函式,其中的換行符是b『\r\n』。

如上同樣的文字。

執行如下**:

dat_file = open('新建文字文件.txt', 'rb')

dat_file.seek(20, 0)

print(dat_file.tell())

print(dat_file.read())

執行結果為:如果改為dat_file.seek(21, 0),執行結果為:

。即讀取到的是空。當然改成21以上的數字也是讀取為空。

原理:之前提到例子文字大小為21位元組,所以dat_file.read()(假設不移動檔案指標)讀取到的bytes類別字串的長度也為21,其索引是0-20。

如上圖所示,只有當檔案指標在0-20範圍時,才可能讀到內容。

本文的思想:如果把檔案指標移動到靠後的位置,那麼只要readlines方法返回的list的長度大於2,那麼雖然list第乙個元素讀取的行可能不完整,但後面的元素讀取的行肯定都是完整的了。而且考慮到了最後一行或多行是空行的情況。

**:

import os

def get_last_line(inputfile):

filesize = os.path.getsize(inputfile)

blocksize = 1024

dat_file = open(inputfile, 'rb')

last_line = b""

lines =

if filesize > blocksize:

maxseekpoint = (filesize// blocksize)#這裡的除法取的是floor

maxseekpoint -= 1

dat_file.seek(maxseekpoint * blocksize)

lines = dat_file.readlines()

while((len(lines)<2) | ((len(lines)>=2)&(lines[1]==b'\r\n'))):#因為在windows下,所以是b'\r\n'

#如果列表長度小於2,或者雖然長度大於等於2,但第二個元素卻還是空行

#如果跳出迴圈,那麼lines長度大於等於2,且第二個元素肯定是完整的行

maxseekpoint -= 1

dat_file.seek(maxseekpoint * blocksize)

lines = dat_file.readlines()

elif filesize:#檔案大小不為空

dat_file.seek(0, 0)

lines = dat_file.readlines()

iflines:#列表不為空

for i in range(len(lines)-1,-1,-1):

last_line = lines[i].strip()

if(last_line != b''):

break#已經找到最後乙個不是空行的

dat_file.close()

return last_line

#該函式返回的是bytes

last = get_last_line('新建文字文件.txt')

last = last.decode()

print(last)

你也可以通過本文的例子文本來進行測試,並將**改成blocksize = 3,然後debug方式檢視**執行過程。

Python3 讀取中文檔案txt編碼問題

嘗試用python寫乙個wordcloud的時候,出現了編碼問題。照著網上某些部落格的說法添添改改後,結果是變成了 unicodedecodeerror utf 8 codec can t decode byte 這個錯誤。搗鼓了一天啊,txt 此處為本人現下內心表情 最後,乾脆寫個最簡單的檔案讀取...

python 讀取txt中文文字

txt文字的儲存形式有四種ansi,utf 8,unicode,unicode big endian。後面兩種比較少見,說說前面兩種吧。普通的開啟檔案的操作是這樣的 coding utf 8 path u 輸入你的路徑 f open path text f.readlines 當txt檔案為ansi...

python3讀取網頁

網上用python讀取網頁的介紹很多,但是因為版本的問題,總是弄不對,這裡就介紹下python3讀取網頁的步驟,較少,只是為了與python2 相區別 urlopen url 另外,python中的製表符如下 在需要在字元中使用特殊字元時,python用反斜槓 轉義字元。如下表 原始字串 有時我們並...