2015-07-22 2 views
0

Здравствуйте, у меня возник вопрос о циклах. Теперь ситуация в том, что я получил файл csv, где я проверяю, есть ли в столбце3 (строка [2]) значение «1». Если не просто пропустить его и цикл снова сложить значения:Прокрутите строки csv и проверьте для определенного значения

i = 1 
maxuserid = 7255 

result_liked = [] 
with open('source/to/file/user_id%i.csv' %i,'r') as fin: 
    for row in csv.reader(fin, delimiter='\t'): 
     if int(row[2]) >= 1: 
      result_liked.append(row) 
      i += 1 
     else: 
      i += 1 
#more code 

Дело в том, что мне нужно для цикла, который работает весь код и после запуска завершена добавить значение «1» до моего i переменная.

Цель моего кода - запустить весь код и после его завершения. Я хочу добавить значение i от 1 до 2 и снова запустить цикл, пока не достигнут maxuserid 7255. Как я могу получить цикл, который делает это от 1 до 7255?


EDIT:

import csv 


maxuserid = 7255 
result_liked = []  
for i in range(maxuserid): 

    with open('source/to/file/user_id%i.csv' %(i+1),'r') as fin: 
     for row in csv.reader(fin, delimiter='\t'): 
      if int(row[2]) >= 1: 
       result_liked.append(row) 

    training_data = result_liked[:2] 
    test_data = result_liked[2:] 

    training_data_bookid = [el[1] for el in training_data] 
    test_data_bookid = [el[1] for el in test_data] 

    #training_data_bookid_int = map(int, training_data_bookid) #python2 
    training_data_bookid_int = list(map(int, training_data_bookid)) #python3 
    test_data_bookid_int = list(map(int, test_data_bookid)) #python3 

    books_list = [] 
    for j in range(0,2): 
     with open('source/to/file/output_new.csv', 'rt') as f: 
      reader = csv.reader(f, delimiter=',', quotechar='"') 
      for row in reader: 
       get_book_id = training_data_bookid_int[j] 
       if get_book_id == int(row[0]): 
        books_list.append([row[2],row[1]]) 

    b = sorted(books_list, reverse=True, key=lambda x:int(x[0])) 
    c = [el[1] for el in b] 

    c_int = list(map(int, c)) 

    check_training_vs_test = set(c_int) & set(test_data_bookid_int)   

    with open("result.txt", "a") as text_file: 
     text_file.write("Userid: %i || Liked: %s || Test: %f" % (i, len(test_data), len(check_training_vs_test))) 
+0

Вы можете завершить цикл с помощью 'if i> = maxuserid: break'. – martineau

+1

Обновлен мой ответ – kvorobiev

ответ

1

Try следующий код

maxuserid = 7255 
result_liked = [] 
for i in range(maxuserid): # this loop iterates through all users files 
    with open('source/to/file/user_id%d.csv' % (i+1),'r') as fin: 
     for row in csv.reader(fin, delimiter='\t'): 
      if int(row[2]) >= 1: 
       result_liked.append(row) 

Update

Я думаю, что нужно что-то вроде:

maxuserid = 7255 
for i in range(maxuserid): 
    result_liked = [] # form a separate list for each csv file 
    with open('source/to/file/user_id%i.csv' %(i+1),'r') as fin: 
     for row in csv.reader(fin, delimiter='\t'): 
      if int(row[2]) >= 1: 
       result_liked.append(row) 

    if len(result_liked) < 3: # if list too few elements just go to next file 
     continue 
    training_data = result_liked[:2] 
    test_data = result_liked[2:] 
    ... 
+0

Но что, если значение, например, user_id3, равно 0. Тогда цикл будет нарушен правильно? Как я могу это решить? – Rotan075

+0

@ Rotan075 No. Если все значения в некотором файле равны 0, данные из этого файла просто не будут добавлены к result_liked.Next будет обработан следующий файл (user_id4 в этом случае). Результатом является список всех строк, где 'row [2]> = 1' из всех файлов user_id1.csv ... user_id7255.csv – kvorobiev

+0

Да, код вас работает. Но у меня проблема. Оставшийся код (который не включен в мой вопрос) требует, чтобы 'result_liked = []', был заполнен. Но в моем user_id3 проверка 'row [2]> = 1' не удастся и, следовательно, мой код сломается. Любая идея, как я могу это решить? – Rotan075

Смежные вопросы