【问题标题】:for loop in for loop, python, csv reader/writerfor 循环中的 for 循环、python、csv 读取器/写入器
【发布时间】:2013-08-28 13:37:15
【问题描述】:

我是 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()

【问题讨论】:

    标签: python mysql csv


    【解决方案1】:

    您需要重新打开 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
    

    【讨论】:

    • 如果答案对您有用,请将其标记为accepted
    【解决方案2】:

    我认为你必须注意变量的格式,因为你比较整数和字符串(来自 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)
    

    似乎对我有用

    【讨论】:

    • 那为什么它第一次在输出文件中只打印第一个user_id
    • 事实上我没有用数据库测试,我也用列表测试。尝试迭代记录集,我编辑我的答案
    猜你喜欢
    • 2016-09-30
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2017-11-30
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多