或許有的小白不知道這個檔案指標就會出現以下問題:
案例一:
**含義:寫入三句話,並呼叫兩次read()函式讀取兩次文字
file
=open
("c:\\try.txt"
,'w'
,encoding=
"utf-8"
)file
.write(
"i'm the first row.\n"
)file
.write(
"i'm the second row.\n"
)file
.write(
"i'm the third row.\n"
)file
.close(
)file
=open
("c:\\try.txt"
,'r'
,encoding=
"utf-8"
)print
("第一眼"
)print
(file
.read())
print
("第二眼"
)print
(file
.read())
file
.close(
)print
("程式執行完畢"
)'''
執行結果:
第一眼i'm the first row.
i'm the second row.
i'm the third row.
第二眼程式執行完畢
'''
案例二:
**含義,統計文字行數以及單詞有多少個及單詞出現的次數
with
open
("c:\\try.txt"
,'r+'
,encoding=
"utf-8"
)as f:
f.write(
"i'm the first row.\n"
) f.write(
"i'm the second row.\n"
) f.write(
"i'm the third row.\n"
) line=f.read(
).count(
"\n"
)print
("行數是:"
, line)
print
("單詞的個數是:"
, line + f.read(
).count(
" ")
) word=f.read(
).replace(
"\n"
," "
).replace(
".","")
.split(
" ")
word.pop(
) dic=
for i in word:
dic[i]
=[word.count(i)
]print
(dic)
'''執行結果:
行數是: 0
單詞的個數是: 0
{}'''
提出問題:咦!為什麼都沒有成功呢?其實**是對的,就是忽略了檔案的指標,這兩個案例都是同乙個問題,那到底是什麼因素導致我們無法二次讀取呢?
這是因為python讀取文字採用了文字指標,指標在哪就在哪寫,指標在哪,你就只能讀取指標後面的東西。
舉個例子
注意:這個檔案中寫入的還是案例一,寫入進去的三句話。
file
=open
("c:\\try.txt"
,'r'
,encoding=
"utf-8"
)print
(file
.read(1)
)print
(file
.read(2)
)print
(file
.read(3)
)'''
執行結果:i'm
th'''
結論:可以看到第乙個read()裡面的引數是1,表示讀取指標後面乙個元素,讀取完,指標後移動一位,第二個read()裡面的引數是2,表示讀取指標後面的兩個元素,讀取完,指標後移動兩位等等,以此類推。這就為什麼能解釋為什麼案例一與案例二的問題了,讀取完或者寫完,指標都在文字的結尾處了,無論你做什麼操作,都無法檢視。
那麼我們知道原因的所在了,引出今天的正題!!!
seek()函式設定游標的位置
tell()函式獲取檔案的指標位置
使用seek()設定指標的位置,以便重新讀取
seek(x,y)裡面有兩個引數
x代表從檔案開頭的第幾個位元組位置開始讀取
y有三個選項,主要是以什麼為參考點,來進行指標移動的。
(1)0
表示絕對位置(檔案的開頭位置),如果不選第二個引數,預設為0。
(2)1
表示相對位置(游標的當前位置)。
(3)2
表示游標在檔案的末尾,可以從檔案的末尾,移動幾個位置後開始讀。
注意:x都可以是負數,要不在y為2的時候用正數當然會報錯,所以得用負數。
案例一:使用seek()與tell()函式後的效果
file
=open
("c:\\try.txt"
,'w'
, encoding=
"utf-8"
)file
.write(
"i'm the first row.\n"
)file
.write(
"i'm the second row.\n"
)file
.write(
"i'm the third row.\n"
)file
.close(
)file
=open
("c:\\try.txt"
,'r'
, encoding=
"utf-8"
)print
("第一眼"
)print
(file
.read())
print
("指標的位置:"
,file
.tell())
file
.seek(0)
print
("指標的位置:"
,file
.tell())
print
("第二眼"
)print
(file
.read())
file
.close(
)'''
執行結果:
第一眼i'm the first row.
i'm the second row.
i'm the third row.
指標的位置: 61
指標的位置: 0
第二眼i'm the first row.
i'm the second row.
i'm the third row.
'''
結論:二次讀取成功,說明我們之前的分析正確。
那麼我們也試試把seek()函式加入到第二個案例裡吧!
案例二:使用seek()函式後的效果。
with
open
("c:\\try.txt"
,'r+'
, encoding=
"utf-8"
)as f:
f.write(
"i'm the first row.\n"
) f.write(
"i'm the second row.\n"
) f.write(
"i'm the third row.\n"
) f.seek(0)
line = f.read(
).count(
"\n"
)print
("行數是:"
, line)
f.seek(0)
print
("單詞的個數是:"
, line + f.read(
).count(
" ")
) f.seek(0)
word = f.read(
).replace(
"\n"
," "
).replace(
".","")
.split(
" ")
word.pop(
) dic =
for i in word:
dic[i]
=[word.count(i)
]print
(dic)
'''執行結果:
行數是: 3
單詞的個數是: 12
'''
小白必看的Python爬蟲流程
定義 網路爬蟲 web spider 又被稱為網頁蜘蛛,是一種按照一定的規則,自動地抓取 資訊的程式或者指令碼。簡介 網路蜘蛛是乙個很形象的名字。如果把網際網路比喻成乙個蜘蛛網,那麼spider就是在網上爬來爬去的蜘蛛。網路蜘蛛是通過網頁的鏈結位址來尋找網頁,從 某乙個頁面開始,讀取網頁的內容,找到...
python小白必看,匿名函式
在函式中使用lambda 語句來生成乙個函式物件,廣泛用於需要函式物件作為引數或比較簡單並且只使用一次的場合。匿名函式 沒有名字的函式,且只有乙個式子,只能做一些簡單的東西 lambda 形參1,形參2,形參n 表示式 lambda 宣告 後接形參 後加 表示式 lambda 引數1 引數2 引數n...
小白必看 Python高階應用
python相信大家並不陌生,身邊有很多的朋友都在學習python,今天就給大家詳細介紹下python高階應用。lambda 函式 lambda 函式是一種比較小的匿名函式 匿名是指它實際上沒有函式名。python 函式通常使用 def a function name 樣式來定義,但對於 lambd...