2012-07-19 35 views
0

我正在使用scrapy來抓取一些數據。 我得到了2蜘蛛=蜘蛛a和b從第二個蜘蛛讀取的文件陷入了困境

蜘蛛a獲取一些數據並將其寫入文件。 蜘蛛b讀取數據。

問題是,蜘蛛B會得到一個空文件。

我可以看到,蜘蛛完成他的工作後,該文件被填充。

我花了幾個小時圖了這一點。

代碼片段:

蜘蛛

f = open('file.txt', 'a+') 
f.write("str") 
f.write("\n") 
f.close() 

蜘蛛b

f = open('file.txt') 
for line in f: 
    print line 
f.close() 

沒有出來,有什麼不對呢?

編輯:我得到它的工作。 我用'a'打開一個文件 寫一行然後關閉文件。 這適用於所有行。

代碼段進行了修訂。

回答

1

(1)你想要f.close()而不是f.close在「蜘蛛b」中。現在的方式是,你正在而不是正確地關閉文件,所以它的緩衝區沒有被刷新。

此外,關於您在使用的f.flush()「蜘蛛」要確保你知道這個照會的文件:

注意的flush()不將文件數據不一定寫入磁盤。使用 flush()後跟os.fsync()以確保此行爲。

其實除非你有一個很好的理由,否則可能只是close()這個文件。如果您確實需要衝洗它,請確保您也使用os.sfsync()

(2)此外,而不是

for line in f: 
    print f 

試試這個:

for line in f: 
    print line 

最後一點,看看使用with來管理打開的文件。例如

with open('file.txt') as f: 
    # put file related actions here 
    for line in f: 
     print line 

會自動關閉該塊末尾的文件,或者遇到異常。

+0

是的,而不是相信'flush'我只是關閉文件。 – DSM 2012-07-19 18:33:24

+0

@DSM是的,一致認爲,這通常是更好的方法,除非由於某種原因該文件需要保持打開狀態(想不到這是一個很好的例子) – Levon 2012-07-19 18:34:20

+0

我認爲這是與蜘蛛a失蹤關閉有關。 我沒有找到合適的狀態來關閉它。 我想在所有請求完成時關閉它。 有沒有辦法知道這樣的事情? 我試過了__del__函數,但這並沒有辦法。 當我試圖讀取一個文件蜘蛛A沒有創建,蜘蛛B產生正確的行爲。 – DjangoPy 2012-07-19 19:23:18

0

除了您使用f.close()print line進行的兩個拼寫錯誤外,您的示例不會顯示任何問題。我的猜測是在你真實的代碼中,你嘗試遍歷b中的文件,然後等待添加更多的數據,然後b嘗試繼續進行交互。你做不到。如果迭代器結束,它不能恢復。解決這個問題的最簡單方法是用f.readline()重寫你的代碼:

while True: 
    line = f.readline() 
    if not line: 
     break 
    print line