python用法 - plt gcf




為什麼我不能在打開的文件上調用read()兩次? (5)

read() 消耗 。 因此,您可以重置文件,或在重新閱讀之前尋找開始。 或者,如果它適合您的任務,您可以使用read(n)僅消耗n個字節。

對於我正在進行的練習,我試圖使用read()方法兩次read()給定文件的內容。 奇怪的是,當我第二次調用它時,它似乎沒有將文件內容作為字符串返回?

這是代碼

f = f.open()

# get the year
match = re.search(r'Popularity in (\d+)', f.read())

if match:
  print match.group(1)

# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', f.read())

if matches:
  # matches is always None

當然我知道這不是最有效或最好的方式,這不是重點。 關鍵是,為什麼我不能兩次調用read() ? 我是否必須重置文件句柄? 或者關閉/重新打開文件以執行此操作?


到目前為止,每個回答過這個問題的人都是絕對正確的 - read()會在文件中移動,所以在你調用它之後,你就無法再次調用它。

我要補充的是,在您的特定情況下,您不需要尋找開始或重新打開文件,您只需將您在本地變量中讀取的文本存儲,並使用它兩次,或者在您的計劃中,您可以多次使用:

f = f.open()
text = f.read() # read the file into a local variable
# get the year
match = re.search(r'Popularity in (\d+)', text)
if match:
  print match.group(1)
# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', text)
if matches:
  # matches will now not always be None

是的,如上所述......

我只寫一個例子:

>>> a = open('file.txt')
>>> a.read()
#output
>>> a.seek(0)
>>> a.read()
#same output

每個打開的文件都有相關的位置。
當你讀()時,你從那個位置讀。 例如, read(10)從新打開的文件中讀取前10個字節,然後另一個read(10)讀取接下來的10個字節。 不帶參數的read()讀取文件的所有內容,將文件位置保留在文件的末尾。 下次調用read() ,沒有什麼可讀的。

您可以使用seek來移動文件位置。 或者在你的情況下可能更好的做一個read()並保留兩個搜索的結果。


讀指針移動到最後讀取的字節/字符之後。 使用seek()方法將讀指針倒回到開頭。





io