首先要理解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用反斜槓 轉義字元。如下表 原始字串 有時我們並...