Python не найдет определенные вещи в файлах csv

#python

#python

Вопрос:

 import pyfiglet
import csv

ascii_banner = pyfiglet.figlet_format("Menu   Program .")
print(ascii_banner)

start = str(input("1. Process an order.  2. View previous orders. 3. Edit Menu nOption: "))

if start == "1":
    print("Welcome")
    with open('menu.csv') as f:
        reader = csv.reader(f)
        for row in reader:
            print(row)
    fid = str(input("What is the food ID?"))
    if fid == row[1]:
        print(row[2])
    if fid != row[1]:
        print("That is not an id.")
  

Мой файл csv:

 foodname,fid,price
All day large,1,Five Pounds Fifty
All day small,2,Three Pounds Fifty
Hot Dog,3,Three Pounds
Burger,4,Four Pounds
Cheese Burger,5,Four Pound Twenty Five
Chicken goujons,6,Three Pounds Fifty
Fries,7,One Pound Seventy Five
Salad,8,Two Pound Twenty
Milkshake,9,Two Pound Twenty
Soft Drinks,10,One Pound Thirty
Still water,11,90 Pence
Sparkling water,12,90 Pence
  

Когда я запускаю его, программа работает, если ввод равен 12, но любое другое число «не является идентификатором», что я нахожу странным.
Кто-нибудь знает, почему это так и как я могу это исправить?

Комментарии:

1. row содержит значения из последней строки в вашем CSV-файле. Вы можете понять, почему?

2. Не идея, я не силен в таких вещах, я знаю основы, и я делаю это для школы

3. Пожалуйста, прочитайте о том, как отлаживать небольшие программы , просмотрите учебник по Python и используйте pythontutor , чтобы помочь вам визуализировать ваш код

4. Как вы думаете row , что содержится после того, как вы закончите с файлом?

Ответ №1:

давайте поставим print(row) после вашего while цикла и перед fid переменной. Что он печатает? Он выводит:

 ['Sparkling water', '12', '90 Pence']
  

Это потому, что в вашем while цикле вы печатали только row s один за другим, но не сохраняли их, поэтому потребовался только последний.

Тогда вы уже догадались. Вот почему это работает, только если вы вводите 12 в качестве входных данных.

Самый простой способ решить эту проблему — преобразовать ваш reader файл в list и поместить его в row переменную. Вы можете сделать это легко следующим образом:

 with open('menu.csv') as f:
        reader = csv.reader(f, delimiter=',')
        row = list(reader)
  

теперь, если вы print(row) , вы получите 2D list :

 [['foodname', 'fid', 'price'], ['All day large', '1', 'Five Pounds Fifty'], ['All day small', '2', 'Three Pounds Fifty'], ['Hot Dog', '3', 'Three Pounds'], ['Burger', '4', 'Four Pounds'], ... ]]
  

это означает, что ваш fid теперь row[1-12][1] доступен для каждого menu товара и цены на row[1-12][2] etc. ( 1-12 потому что at 0 — это имена ваших столбцов foodname, fid и price)

Чтобы сначала распечатать цену из входных данных, давайте получим fid из входных данных:

 fid = str(input("What is the food ID?"))
  

как вы написали, возвращает a str и мы хотим int , поэтому давайте сделаем это так:

 fid = int(input("What is the food ID?"))
  

Теперь к основной логике:

 if fid > 0 and fid < len(row):
    print (row[fid][2])
  

Сначала мы проверяем, fid > 0 потому что там находятся имена ваших столбцов, а затем проверяем, находится ли fid в диапазоне, чтобы избежать index out of range fid < len(row) . Если условие выполнено, то мы печатаем row в позиции fid и печатаем ее цену, которая находится в позиции 2 в вашем csv

Итак, в конце ваш код должен выглядеть так.

 import pyfiglet
import csv

ascii_banner = pyfiglet.figlet_format("Menu   Program .")
print(ascii_banner)

start = str(input("1. Process an order.  2. View previous orders. 3. Edit Menu nOption: "))

if start == "1":
    print("Welcome")
    with open('menu.csv') as f:
        reader = csv.reader(f, delimiter=',')
        row = list(reader)
    
    print(row)
    fid = int(input("What is the food ID?"))

    if fid > 0 and fid < len(row):
        print (row[fid][2])
    else:
        print ("That is not an id.")
  

Чтобы печатать элементы красиво, я бы добавил print('n'.join(map(' | '.join, row))) вместо print(row) , но я оставлю это вам.

И, пожалуйста, взгляните на чтение и запись файлов CSV на Python и на будущее, сначала попробуйте решить вашу проблему с помощью документов Python, а затем, если вы действительно не можете решить свою проблему, опубликуйте ее здесь.