Python чтение csv и выполнение оператора печати несколько раз - PullRequest
1 голос
/ 04 августа 2020

У меня есть файл csv с 4 полями:

JFK,John F Kennedy International,5326,5486 
ORY,Paris-Orly,629,379
MAD,Adolfo Suarez Madrid-Barajas,1428,1151
AMS,Amsterdam Schiphol,526,489
CAI,Cairo International,3779,3584

Я сравниваю введенный пользователем код с первым полем каждой строки. Если он совпадает, я хочу напечатать второе поле. Если он не совпадает с какой-либо записью в CSV, я хочу напечатать 'ERROR'.

Но 'ERROR' печатается несколько раз, даже если код найден.

Как можно Я предотвращаю это?

Код:

if num == 1:
    Adetails = input("Enter airport details (Please enter the three letter code for the UK airport): ")
    while Adetails not in ("LPL", "BOH"):
        Adetails = input("Error three letter airport code invalid. Please enter either LPL or BOH: ")
    Odetails = input("Enter overseas airport details (Please enter the three letter code for the overseas airport): ")
    for row in inputfile:
        if row[0] == Odetails:
            print(row[1])
            repeat = False
        else:
            if row[0] != Odetails:
                print("ERROR")

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Вы печатаете что-то для каждой строки тестируемого CSV, будь то извлеченные данные или «ERROR».

Что вы хотите сделать, так это вывести «ERROR», только если вы зациклились до конца, не встретив ошибки действительная запись. Это хорошее место для использования блока else из for циклов: он запускается только в том случае, если вы исчерпаете l oop без выхода break.

Итак, ваш код будет быть:

for row in inputfile:
    if row[0] == Odetails:
        print(row[1])
        break
else: 
    # Executed if we never did break out of the loop, 
    # which means that no matching entry was found
    print("ERROR")
0 голосов
/ 04 августа 2020

Сначала вы должны открыть файл. Используйте import csv вверху. Вы можете увидеть примеры из документации csv:

https://docs.python.org/3/library/csv.html

Вот практическое исправление:

import csv

Adetails = input("Enter airport details (Please enter the three letter code for the UK airport): ")
while Adetails not in ("LPL", "BOH"):
    Adetails = input("Error three letter airport code invalid. Please enter either LPL or BOH: ")
    Odetails = input("Enter overseas airport details (Please enter the three letter code for the overseas airport): ")
    with open('test5.csv') as csvfile:
        inputfile = csv.reader(csvfile)
        for row in inputfile:
            # print(row)
            # print(Odetails)
            if row[0] == Odetails:
                print(row[1])
                break
        else:
            print("ERROR")

Вам нужно работать медленнее . Ключ состоит в том, чтобы работать по одному шагу за раз и точно понимать, что представляет собой каждая переменная (тип) и каким должно быть ее значение. Множество операторов печати (закомментированных здесь), чтобы убедиться, что все именно так, как вы ожидаете, или лучше используйте pycharm или другой отладчик.

Этот ответ предполагает, что существует файл с именем 'test5.csv'

JFK,John F Kennedy International,5326,5486 
ORY,Paris-Orly,629,379 
MAD,Adolfo Suarez Madrid-Barajas,1428,1151 
AMS,Amsterdam Schiphol,526,489 
CAI,Cairo International,3779,3584

Результат выглядит так:

(base) [poleguy@dualie so]$ python test5.py
Enter airport details (Please enter the three letter code for the UK airport): a
Error three letter airport code invalid. Please enter either LPL or BOH: LPL
Enter overseas airport details (Please enter the three letter code for the overseas airport): JFK
['JFK', 'John F Kennedy International', '5326', '5486 ']
JFK
John F Kennedy International
...