2013-07-16 39 views
0

天兒真好,特別行重寫CSV文件中省略 - 的Python 3

我張貼this問題,不得不從@abarnert一些優秀的響應。我試圖從CSV文件中刪除特定的行。我已經瞭解到,CSV文件不允許刪除特定行,因此我將重寫CSV,同時省略特定行,然後將新文件重命名爲舊文件。

根據鏈接中的上述問題,我從工具箱中獲取並返回工具。我試圖重寫的CSV文件是當前從工具箱簽出的工具的一個持續「日誌」。因此,當返回工具時,我需要將該工具從日誌CSV文件中刪除。

這是我到目前爲止有:

absent_past = frozenset(tuple(row) for row in csv.reader(open('Absent_Past.csv', 'r'))) 
absent_current = frozenset(tuple(row) for row in csv.reader(open('Absent_Current.csv', 'r'))) 

tools_returned = [",".join(row) for row in absent_past - absent_current] 

with open('Log.csv') as f: 
    check = csv.reader(f) 
    for row in check: 
     if row[1] not in tools_returned: 
      csv.writer(open('Log_Current.csv', 'a+')).writerow(row) 

os.remove('Log.csv') 
os.rename('Log_Current.csv', 'Log.csv') 

正如你(希望)從上面看,它會打開Log.csv文件,如果一個工具已經返回(即工具。在tools_returned中連續列出),它不會將該條目重新寫入新文件。當所有未返回的工具已寫入新文件時,舊文件將被刪除,新文件將從Log_Current.csv重命名爲Log.csv。

值得一提的是,在重命名之前,已採取的工具將附加到Log_Current.csv。這部分代碼很好地工作:)

我已經被指示避免使用這個系統的CSV,我同意。不過,我想盡可能在​​Python下探索CSV操作,因爲我知道它將在未來派上用場。我將在未來使用contextlib和擱置功能。

謝謝!

編輯:在上面的代碼中,我有如果行[1] ...我希望它意味着它只會檢查行中的第一列的值?基本上,該行將包含Hammer,James,Taken,09:15:25之類的內容,但我只想搜索Hammer的Log.csv文件,因爲tools_returned僅包含工具名稱行,即。錘子,鑽子,鋸子等。[1]行是否正確?

目前,Log_Current.csv文件正在寫入Log.csv文件,無論該工具是否已被替換。因此,我認爲if行[1]等代碼部分不起作用。

回答

1

我想我會回答我自己的問題,因爲我現在已經知道了。上面的代碼是正確的,除了一個小錯誤。當引用一行中的列號時,第一列是列0,而不是列1.當我在列'1'中搜索工具名稱時,它永遠不會起作用,因爲列'1實際上是第二列,這是用戶的名字。

將該行更改爲如果行[0]等用當前檢出的工具列表重寫新文件,並根據需要省略任何已被替換的工具!

+1

StackOverflow應該允許你接受你自己的答案。所以你應該這樣做。 (除非你認爲在這裏根本不值得這樣做,在這種情況下你應該刪除這個問題。) – abarnert

+0

試圖刪除它,但我不能,因爲有答案。那麼我可能會接受我的答案。希望它能幫助別人。 – jars121