2013-12-11 35 views
0

我無法將我的頭充滿發生器,有時我碰巧用正確的方式使用它們,有時候我沒有。實現生成器來填充數據庫

我從.csv文件填充一個DB:

name, location 
Tom, France 
Doug, USA 
Michael, UK 

這裏是我的代碼:

def process_csv(filecsv): 
    f = open(filecsv) 
    f_csv = csv.reader(f) 
    headers = next(f_csv) 
    User = namedtuple('User', headers) 
    for user in f_csv: 
     user = [u.strip() for u in user] 
     user = User(*user) 
     yield user 

def insert(cur, user): 
    u = list(user)[0] # it's a one-elem list so take it 
    cur.execute("INSERT INTO users (name, location) VALUES(%s, %s)", 
    (u.name, u.location)) 


if __name__ == '__main__': 
    cur = cxn.cursor() 
    user = process_csv(filecsv) 
    insert(cur, user) 

當運行此,僅在第一行得到了插入到數據庫。你可以請建議如何解決它?

+1

我們看不出調用這些函數中的任何一個。特別是,它們似乎沒有連接;他們都沒有打電話給對方。這些功能如何相關? – user2357112

+0

對不起,現在更新。 – nutship

+1

只是說如果這是一次性工作,大多數數據庫都有直接從CSV文件導入的功能。例如http://sqlite.org/cvstrac/wiki?p=ImportingFiles和http://dev.mysql.com/doc/refman/5.1/en/load-data.html – YXD

回答

2

process_csv(filecsv)返回用戶的迭代器。 insert將迭代器變成一個列表並顯式地接受第一個項目。 (註釋是錯誤的;它不是一個1元素列表。)相反,遍歷所有的用戶,並插入每一個:

def insert(cur, users): 
    for user in users: 
     cur.execute("INSERT INTO users (name, location) VALUES(%s, %s)", 
     (user.name, user.location)) 

注意,幾乎肯定更好的方法來執行此數據庫操作。這個答案只解決了發電機的問題。

2

你是不是從你的目標,到目前爲止,我認爲, 試試這個:

def process_csv(filecsv): 
    f = open(filecsv) 
    f_csv = csv.reader(f) 
    headers = next(f_csv) 
    User = namedtuple('User', headers) 
    for user in f_csv: 
     user = [u.strip() for u in user] 
     user = User(*user) 
     yield user 

def insert(cur, user): 
    cur.execute("INSERT INTO users (name, location) VALUES(%s, %s)", 
    (user.name, user.location)) 

if __name__ == '__main__': 
    cur = cxn.cursor() 
    for user in process_csv(): 
     insert(cur,user) 

一個generateur是一個迭代器,所以你應該使用它像一個迭代器