簡體   English   中英

for循環for循環,python,csv讀取器/寫入器

[英]for loop in for loop, python, csv reader/writer

我是python的新手,但是經過3天的閱讀和尋找解決方案但都沒有成功,我迷路了。

我有帶有數據(id,user_id ...)的mysql表。 我連接到數據庫,讀取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()

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

我認為您必須注意變量的格式,因為您比較整數和字符串(來自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)

似乎為我工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM