2017-01-13 3 views
0

Я пишу скрипт Python3.x для соответствия определенному тексту в большом CSV-файле. Я очень близок к тому, что ищу, но по какой-то причине я получаю ложный результат. Ниже мой код:DictReader находит совпадение в csv, но получает ложный положительный

from csv import DictReader 

def cluster_lookup(): 
    cluster = input("What cluster are you looking for? ") 
    while True: 
     try: 
      with open('hypervisor.csv') as csvfile: 
       reader = DictReader(csvfile) 
       for col in reader: 
        if col['cluster_name'] == cluster: 
         print(', '.join([col['host_name'], col['ip']])) 
         continue 
     except IOError as err: 
      print('Could not locate the csv file.', err) 
      break 
     else: 
      if col['cluster_name'] is not cluster: 
       print('The cluster cannot be found.') 
       break 

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

What cluster are you looking for? cluster 15 
server150, 192.x.x.x 
server151, 192.x.x.x 
server152, 192.x.x.x 
server153, 192.x.x.x 
server154, 192.x.x.x 
server155, 192.x.x.x 
server156, 192.x.x.x 
server157, 192.x.x.x 
server158, 192.x.x.x 
server159, 192.x.x.x 

Вместо этого он найти кластер я ищу, но и возвращает The cluster cannot be found

+0

Предложение еще будет вызываться всякий раз, когда исключение не генерируется. В этот момент col будет содержать последний элемент из считывателя. Если последний элемент не соответствует, выводится сообщение об ошибке. Лучшим методом было бы установить флаг True в условии if col [] -, а затем проверить флаг в предложении else. –

ответ

1
def cluster_lookup(): 
    cluster = input("What cluster are you looking for? ") 
    try: 
     with open('hypervisor.csv') as csvfile: 
      reader = DictReader(csvfile) 
      isFound = False 
      for col in reader: 
       if col['cluster_name'] == cluster: 
        print(', '.join([col['host_name'], col['ip']])) 
        isFound = True 
      if(isFound == False): 
       print('The cluster cannot be found.') 
       exit() 
    except IOError as err: 
     print('Could not locate the csv file.', err) 
     exit() 
+0

Это именно то, что я искал. Наверное, мне не нужен цикл while, и мне просто нужно было удалить инструкцию 'else'. Спасибо! – Clarkus978

0

проверяет, еще условие только от последнего значения col, который, если не соответствует отпечаткам Не удается найти кластер. Вместо этого вы должны использовать логическую переменную, которая проверяет, если кластер был найден или не

found = False 
try: 
    with open('hypervisor.csv') as csvfile: 
    reader = DictReader(csvfile) 
    for col in reader: 
     if col['cluster_name'] == cluster: 
      print(', '.join([col['host_name'], col['ip']])) 
      found = True 
      continue 
except IOError as err: 
     print('Could not locate the csv file.', err) 
     break 
    else: 
     if not found: 
      print('The cluster cannot be found.') 
      break 
+0

Благодарим за быстрый ответ. Когда я добавляю логическую переменную и запускаю скрипт, он теперь возвращает все имена хоста и ip в файле csv. – Clarkus978