for循环for for循环,python,csv reader / writer

时间:2013-08-26 06:18:24

标签: python mysql csv

我是python的新手,但经过3天的阅读并找到解决方案但没有成功,我迷失了。

我有mysql表的数据(id,user_id ...)。我连接到db,读取user_id并将数据保存到数组“user”中。然后我打开带有很多行和列的csv文件(user_id,名称,邮件,电话,地址......)。在下一步中,我将比较db中的user_id是否与csv文件中的user_id匹配。如果答案是肯定的,那么我将这一行写在另一个csv文件中。

问题是我的代码仅适用于第一个id_user。拜托,你能帮帮我吗?

示例表

table in db:
id     user_id
1      318604
2      318624

csv文件:

318604;    John;    john@gmail.com
318604;    053746;  USA 
318624;    Lucy;    Lucy@gmail.com
318624;    058839   Sweeden
318630;    Luke;    Luke@gmail.com

新文件中的预期结果:

318604;    John;    john@gmail.com
318604;    053746;  USA 
318624;    Lucy;    Lucy@gmail.com
318624;    058839   Sweeden

代码:

cur = con.cursor()
with open('input.csv', mode='rb') as f:
    reader = csv.reader(f, delimiter=';')
    with open('output.csv', mode='a') as w:  
        writer = csv.writer(w)
        with con:            
            cur.execute("SELECT user_id FROM users")
            user=cur.fetchall()            
            for i in range(len(user)):                               
                for row in reader:
                    if(user[i][0]==row[0]):
                        writer.writerow(row)
con.close()

2 个答案:

答案 0 :(得分:3)

您需要重新打开 input.csv 文件。当您浏览文件的每一行而不重新打开它时,您的courser将始终位于文件的最后一行。要修复输入文件向for user循环的移动:

cur = con.cursor()
with open('output.csv', mode='a') as w:  
    writer = csv.writer(w)
    with con:            
        cur.execute("SELECT user_id FROM users")
        user=cur.fetchall()            
        for i in range(len(user)): 
            with open('input.csv', mode='rb') as f:
                reader = csv.reader(f, delimiter=';')                              
                for row in reader:
                    if(user[i][0]==row[0]):
                        writer.writerow(row)
con.close()

我用这段代码测试了它:

import csv
user = [[1,318604],[2,318624]]
with open('output.csv', mode='a') as w:  
    writer = csv.writer(w)      
    for i in range(len(user)):
        with open('input.csv', mode='rb') as f:
            reader = csv.reader(f, delimiter=';')                               
            for row in reader:
                if(str(user[i][1])==row[0]):
                    writer.writerow(row)

而是从数据库输出我使用了包含整数的列表。所以我需要将user[i][1]转换为字符串。另外user[i][0]id,当user[i][1]user_id时,不知道数据库的输出是否相同。

输出:

318604,    John,    john@gmail.com
318604,    053746,  USA 
318624,    Lucy,    Lucy@gmail.com
318624,    058839   Sweeden

答案 1 :(得分:-1)

我认为你必须处理变量的格式,因为你比较整数和字符串(来自csv),试试这个:

cur = con.cursor()
with open('input.csv', mode='rb') as f:
    reader = csv.reader(f, delimiter=';')
    with open('output.csv', mode='a') as w:  
        writer = csv.writer(w)
        with con:            
            cur.execute("SELECT user_id FROM users")
            users=cur.fetchall()            
            for u in user:                               
                for row in reader:
                    if(str(u[0])==str(row[0])): 
                        writer.writerow(row)

似乎对我有用