-1

I am new to python, and trying to create a program which opens a csv file. The user is supposed to enter a barcode , then the program finds that product and the cost of the product. However I got an error which is the title of my thread. Here is my code.

import csv  # imports should go at the top of the file


def read_csv_file():
     """ reads csv data and appends each row to list """
     csv_data = []
     with open("task2.csv") as csvfile:
         spamreader = csv.reader(csvfile, delimiter=",", quotechar="|")
         for row in spamreader:
             csv_data.append(row)
     return csv_data


def get_user_input():
     """ get input from user """
     while True:
        try:
            GTIN = int(input("input your gtin-8 number: "))
            break
        except:
            print ("Oops! That was not a valid number.  Try again")


def search_user_input():
     """ search csv data for string """
     search_user_input
     gtin = get_user_input()
     for row in PRODUCT_DATA:
         #print(row) #debug print
         if row[0] == str(gtin):
             product = row[1]
             price = round(float(row[2]),2)
             print(product, price)
             return(product, price)
     repeat = input("not in there? search again? If so (y), else press enter to continue")
     if repeat == 'y':
         search_user_input()  # calls function again in order to create a loop


def quantity():
    gtin = 0
    product = 0
    price = 0.0
    product_data = read_csv_file()
    product,price = search_user_input() 
    product, price = search_user_input(str(gtin), product_price)
    order = int(input("How much of " + product + " do you want?"))
    price = round(price * order, 2)
    print(quantity,price)

def order_making():
     print("Apples")     

PRODUCT_DATA = read_csv_file()  # call function to read csv 
quantity()  # call the main function
11
  • at which line the error is coming and also the stacktraceback would be helpful Commented Mar 15, 2017 at 9:32
  • Please edit the question to include a Minimal, Complete, and Verifiable example. This includes the stacktrace so we can actually see which line throws the error rather than searching through all of your code. Commented Mar 15, 2017 at 9:33
  • 1
    get_user_input needs to return GTIN. Commented Mar 15, 2017 at 9:34
  • It is line 45 , sorry Commented Mar 15, 2017 at 9:34
  • There several issues with this code. search_user_input does not accept arguments but you're calling it with two in product, price = search_user_input(str(gtin), product_price). Also, I see no reason for search_user_input to call itself recursively. The flow of inputs seems a bit confused with functions being called multiple times. I think you should consider refactoring this tbh. Commented Mar 15, 2017 at 9:37

1 Answer 1

0

I have cleaned the flow up a bit for search_user_input and quantity. In some cases you were calling search_user_input with multiple arguments (it doesn't accept them) and you made it recursive. I have added some comments in the code below. In fact, that function was returning None in your setup, which leads to the TypeError: 'NoneType' object is not iterable error.

The if __name__ == '__main__:' is not necessary in your code, I've included it more as a heads-up for later on when you'll want to start importing your own modules. See this for more info on this topic.

import csv 


def read_csv_file():
     """ reads csv data and appends each row to list """
     csv_data = []
     with open("task2.csv") as csvfile:
         spamreader = csv.reader(csvfile, delimiter=",", quotechar="|")
         for row in spamreader:
             csv_data.append(row)
     return csv_data


def get_user_input():
     """ get input from user """
     while True:
        try:
            GTIN = int(input("input your gtin-8 number: "))
            return GTIN # Breaks the loop and returns the value
        except:
            print ("Oops! That was not a valid number.  Try again")


def search_user_input(product_data): # Pass the csv data as an argument
    """ search csv data for string """
    keep_searching = True

    while keep_searching:
        gtin = get_user_input()
        for row in product_data:
            if row[0] == str(gtin):
                product = row[1]
                price = round(float(row[2]),2)
                return(product, price)
        repeat = input("not in there? search again? If so (y), else press enter to continue")
        if repeat != 'y':
            keep_searching = False 
            return None # This is done implicitly, I'm just making it obvious 


def quantity():

    product_data = read_csv_file()
    matches = search_user_input(product_data)
    if matches: # Will not be True if search_user_input returned None
        product, price = matches[0], matches[1]
        order = int(input("How much of {} do you want?".format(product)))
        price = round(price * order, 2)
        print("That costs {}".format(price))


if __name__ == '__main__': # You'll need this in future for importing modules
    # There was no need to read the csv_data here and make it global
    quantity()  # call the main function
Sign up to request clarification or add additional context in comments.

1 Comment

hello , thank you very much for the help , i have spent some time trying to improve my code and so the user can order multiple products

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.