1

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

我有带有数据的mysql表(id,user_id ...)。我连接到数据库,读取 user_id 并将数据保存到数组“用户”中。然后我打开包含很多行和列(user_id、姓名、邮件、电话、地址...)的 csv 文件。在下一步中,我比较 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()
4

2 回答 2

3

您需要重新打开input.csv文件。当您浏览文件的每一行而不重新打开它时,您的课程将始终位于文件的最后一行。要修复输入文件的移动打开到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
于 2013-08-26T07:30:15.443 回答
-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)

似乎对我有用

于 2013-08-26T07:39:40.497 回答