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 filedef 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_datadef get_user_input():""" get input from user """while True:try:GTIN = int(input("input your gtin-8 number: "))breakexcept:print ("Oops! That was not a valid number. Try again")def search_user_input():""" search csv data for string """search_user_inputgtin = get_user_input()for row in PRODUCT_DATA:#print(row) #debug printif 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 loopdef quantity():gtin = 0product = 0price = 0.0product_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
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_datadef 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 valueexcept: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 = Truewhile 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 Noneproduct, 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 globalquantity() # call the main function