2013-05-04 19 views
-1

如果我在Python鍵入:的Python閱讀()函數返回空字符串

open("file","r").read() 

有時它返回文件作爲一個字符串的確切內容,另外一些時候,它返回一個空字符串(即使文件不是空的)。 有人可以解釋這取決於什麼嗎?

+4

'read'從文件中的當前位置讀取。如果您已經讀出所有內容(當前位置在末尾),它將返回一個空字符串。如果你想再次閱讀文件,你將不得不重新打開它或者開始搜索。 – 2013-05-04 12:42:05

+0

@Pavel Anossov我知道。如果我這樣做,也會發生同樣的事情:f = open(「file」,「r」); f.read() – 2013-05-04 12:49:46

+1

@FrancescoR。然後文件**是空的。否則,請提供一些我們可以用來重現問題的代碼和文件內容。 – Bakuriu 2013-05-04 12:52:36

回答

3

file.read() method文檔:

時,立即遇到EOF則返回一個空字符串。

你已經擊中了文件對象的末尾,沒有更多的數據要讀取。文件保持'當前位置',一個指向文件數據的指針,從0開始,並在讀取dada時遞增。

請參閱file.tell() method來讀出該位置,並使用file.seek() method來更改它。

+0

我檢查了我用過的文件,它們都是空的。對不起,我的錯誤 – 2013-05-04 13:04:02

+0

對,在這種情況下EOF(文件結束)是在開始,位置0. – 2013-05-04 13:32:22

10

當你達到文件(EOF)結束時,.read方法返回'',因爲沒有更多的數據讀取。

>>> f = open('my_file.txt') 
>>> f.read() # you read the entire file 
'My File has data.' 
>>> f.read() # you've reached the end of the file 
'' 
>>> f.tell() # give my current position at file 
17 
>>> f.seek(0) # Go back to the starting position 
>>> f.read() # and read the file again 
'My File has data.' 

文件鏈接:read()tell()seek()

注:如果這種情況發生在你讀取文件的第一次,檢查該文件是不是空的。如果不是在read之前試穿file.seek(0)

+0

我檢查了我用過的文件,它們都是空的。抱歉,是我的錯 – 2013-05-04 13:04:28

0

還有一個問題,那就是文件本身可能會被泄漏,並且只能被垃圾收集器遲到甚至從不回收。因此,使用與語句:

with open(...) as file: 
    data = file.read() 

這是很難用一個C-ISH背景(C,C++,Java和C#和可能其他人),以消化任何人,因爲縮進總有創建一個新的範圍和在該範圍內聲明的任何變量都是外部不可訪問的。在Python中,情況並非如此,但您必須先習慣這種風格...