2013-08-26 4 views
1

Я новичок в python, но после 3 дней чтения и поиска решения без успеха я теряюсь.for loop in for loop, python, csv reader/writer

У меня таблица mysql с данными (id, user_id ...). Я подключаюсь к db, читаю user_id и сохраняю данные в массиве «пользователь». Затем я открываю файл csv с большим количеством строк и столбцов (user_id, имя, почта, телефон, адрес ...). На следующем шаге я сравниваю, если user_id из db совпадает с user_id в файле csv. Если да, то я пишу эту строку в другом CSV-файле.

Проблема в том, что мой код работает только для первого id_user. Не могли ли вы помочь мне, пожалуйста?

Пример таблицы:

table in db: 
id  user_id 
1  318604 
2  318624 

CSV файл:

318604; John; [email protected] 
318604; 053746; USA 
318624; Lucy; [email protected] 
318624; 058839 Sweeden 
318630; Luke; [email protected] 

Ожидаемый результат в новом файле:

318604; John; [email protected] 
318604; 053746; USA 
318624; Lucy; [email protected] 
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

Вам необходимо открыть файл 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, [email protected] 
318604, 053746, USA 
318624, Lucy, [email protected] 
318624, 058839 Sweeden 
+0

Спасибо, это работает как шарм! – djpiky

+0

Если ответ работает на вас, отметьте его как [принято] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – ton1c

-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) 

, кажется, к работе for me

+0

Тогда почему он печатает первый раз на выходе файл только для первого 'user_id'? – ton1c

+0

Я не тестирую базу данных, я также тестирую список. Попробуйте выполнить итерацию по набору записей, я отредактировал свой ответ –