2016-02-12 58 views
0

打開一個正在退出的文件並向其中寫入字典時,有時會將字典(正在寫入一行)追加到上一行的末尾。我如何設置這個代碼來防止這種情況發生?它似乎只發生在先前的代碼'run'崩潰並且我重新啓動了代碼,並且它開始寫入前一次運行的文件(我想要的 - 只是沒有添加到前一行的末尾)。Python - 有時將一個CSV文件的附加行添加到前一行的末尾

 #Creating output dictwriter for results 
     with open(csv, 'a', 0) as outputFile: 
      fieldnames = csvCols 
      successWriter = csv.DictWriter(outputFile, fieldnames=fieldnames) 
      successWriter.writerow(out_dict) 
     outputFile.close() 

打開文件'ab'模式會有所作爲嗎?

+0

是從「撞車」的文件在最後一行的末尾缺少一個換行符?它是否像打開文件追加之前檢查文件的最後一行換行符一樣簡單? – mhopeng

+0

請注意,您不需要'outputFile.close()'行,因爲'with'語句會自動爲您關閉文件。 –

+0

是的,他們是 - 我不知道該怎麼做。而且我也認爲這不是必要的,因爲我確信可以通過某種方法確保總是寫一個換行符。因爲,而這正是我感到困惑的地方,當腳本崩潰時,文件始終是關閉的 - 也就是說,崩潰不會發生在上面的代碼中,而是出現在代碼之前或之後的代碼中 - 但是文件是在這些情況下不開放或關閉並已寫入。 – traggatmot

回答

0

您通常會在文件行中添加「\ n」,以便寫入下一行。

+0

寫入文件正常進行時會自動發生。但是,如果調用上述代碼的腳本崩潰了,並且我重新啓動它,它會將第一個新寫入的行附加到最後一個寫入的行,然後正常繼續,每次調用時都會自動創建新行。你的回答似乎沒有解決這樣一個事實,即大部分時間它都會自行處理新的字符。 – traggatmot

+0

那麼如果文件將項目添加到文檔中,代碼就不會崩潰。該文檔僅在碰撞時更新.close() – user5823815

+0

不,它可能在寫入之前的某個部分發生崩潰。正在編寫的內容是從某些Web服務中提取的 - 這一部分不太可能崩潰或導致崩潰,但有時Web服務產生的輸出是垃圾,並且可能導致代碼段所在的較大腳本崩潰。如果發生這種情況,並且我重新啓動較大的腳本,它將再次處理Web服務結果,並開始寫入已存在的文件,第一次無法寫入新行並在其他時間成功。理解? – traggatmot

0

以下應在Python 2.x的正常工作:

# Creating output dictwriter for results 

with open(csv, 'ab') as outputFile: 
    successWriter = csv.DictWriter(outputFile, fieldnames=csvCols) 
    successWriter.writerow(out_dict) 

with聲明將自動關閉您的文件,即使是你的腳本有問題。如果您不使用ab模式,則每次調用writerow會導致額外的空行。

如果您正在使用Python 3.x中,你將需要:

# Creating output dictwriter for results 

with open(csv, 'a', newline='') as outputFile: 
    successWriter = csv.DictWriter(outputFile, fieldnames=csvCols) 
    successWriter.writerow(out_dict) 
相關問題