2011-12-10 49 views
1

我有一個包含237行事務的CSV文件,我已經想通過按正確順序對事務進行分組,排序並創建一個新的CSV文件按帳號。不過,我想更進一步,並根據帳號與所有帳號的交易創建多個CSV文件。創建基於列表的文件並將其寫入類似項

我想我想要做的只是將每行添加到基於賬號的合適的CSV文件,但我想動態地做到這一點,所以我不必創建每個變量,因爲有始終是未知數量的帳號。所以用這個數據

Account #, Date, Dollar Amount (stored as heading) 
001, 1/1/11, $25 
001, 1/1/11, $20 
002, 1/1/11, $15 
003, 1/4/11, $19 

我想創建一個基於帳戶數三個單獨的CSV文件。我不想找人編寫代碼,但我希望Python中有一些模塊,我不知道涉及這種類型的過程。如果有人能指點我正確的方向,我將不勝感激。

謝謝

+0

在這樣的任務,它始終是preferrable(我認爲)收集所有數據首先,然後纔將結果寫入文件。如果文件的目標是增長,則以追加模式打開文件是很好的,例如日誌或歷史記錄文件。在你的情況下,你應該從你的主CSV中收集所有數據,並以適當的方式對它進行分組,然後一個接一個地寫入每個文件。談論比實際運行腳本慢得多。 – heltonbiker

回答

1

這是一個快速(可能不是很有效)的解決方案。

from sets import Set 
import csv 

source = list(csv.reader(open("account_file.csv"))) 

accounts = Set(line[0] for line in source) 

for account in accounts: 
    out = open(account+".csv","w") 
    out.write("\n".join(",".join(x) for x in source if x[0] == account)) 
    out.close() 
+0

非常感謝你,這正是我所需要的。因爲有人教我釣魚,還有一個人給我魚,所以不知道應該作出哪種答案。我理解這個解決方案以及它爲什麼可行,但我需要閱讀更多關於列表和設置的內容以充分理解。 –

+0

@akevit在此解決方案中,文件被讀取的次數與有不同帳戶的次數相同。這不是很好。同時注意模式'w'將使任何先前存在的文件消失 – eyquem

+0

@eyquem這一點對於之前存在的文件消失是可以的,並且我將源變量更改爲現有變量,我擁有該變量包含CSV(排序)作爲列表的列表。不知道這是否會改變程序的效率。 –

1

我不認爲有這樣的模塊。我會爲每個帳戶操作創建單獨的列表,並將它們放在字典中,其中密鑰是帳戶號碼。然後在迭代整個輸入文件後,可以將每個列表保存爲單獨的.csv文件。

如果您的輸入文件已經排序,那麼您可以簡單地將行復制到輸出文件,然後當帳戶更改關閉輸出文件並打開新帳戶的下一個輸出文件時。

+0

沿着我以前的評論逐個保存輸出文件,而不是追加模式。 – heltonbiker

+0

謝謝你們,出於某種原因,這個想法並沒有出現在我的面前。我將嘗試用某種方式用字典來實現這一點,但之後我必須在事實之後對每個文件進行排序。這種方式應該工作,我想我可以弄明白 - 謝謝。 –

0

無需CSV接口的,我更喜歡這樣的:

from collections import defaultdict 
from os.path import getsize 

with open('accounts.csv') as f: 

    first_line = f.readline() 

    d = defaultdict(list) 
    for line in f: 
     d[line.split(',')[0]].append(line) 

    for account,lines in d.iteritems(): 
     with open(account+'.csv','a') as f: 
      if getsize(account+'.csv')==0: 
       f.write(first_line) 
      f.write(''.join(lines)) 

該文件是隻讀一次

+0

我相信這會工作,但不幸的是,我有工作,它會超過我的需求。我沒有看到交易數量增加了很多,我的代碼現在只需要幾秒鐘。當我有空閒時間學習一些新的東西時,我一定會更好地審視你寫的內容。 - 謝謝。 –