我正在编写的程序从用户那里获取GTIN-8代码,在CSV文件中搜索它并询问数量等。当我写一个有效的GTIN代码时,它仍然表现得好像我输错了GTIN并要求我重新输入代码。它基本上与我希望它做的相反。
我的CSV文件如下:
GTIN Name Price
12312313 Kit-Kat 0.5
12345670 Mars 0.2
76543210 Bounty 0.3
34563670 Milky Way 0.4
我的代码如下:
def quantityQuestion():
with open("ChocolateCSV.csv", 'r') as file2:
for row in csv.reader(file2):
if str(gtinNum) in row:
receipt.write(str(row) + "\n")
receipt.write(str("- Quantity: " + quantity + "\n"))
price = float(row[2]) * int(quantity)
receipt.write("- Price: " + str("%.2f" % round(price, 2)) + "\n")
restart()
break
elif str(gtinNum) not in row:
print("The code entered could not be found - Please re-enter")
gtinQuestion()
def gtinQuestion():
global gtinNum
gtinNum = input("Please enter the GTIN-8 Code of the product you would like to order:")
if gtinNum.isdigit() == False or len(gtinNum) != 8:
gtinQuestion()
elif gtinNum.isdigit() == True and len(gtinNum) == 8:
quantityQuestion()
gtinQuestion()
答案 0 :(得分:0)
这是错误的,因为您正在检查csv的每一行上输入的代码,并在任何的行与输入的代码不匹配时显示提示。
for row in csv.reader(file2):
if str(gtinNum) in row:
...
break
elif str(gtinNum) not in row:
print("The code entered could not be found - Please re-enter")
gtinQuestion()
相反,如果 all 这些行与输入的代码不匹配,您只想显示提示。
for row in csv.reader(file2):
if str(gtinNum) in row:
...
break
else:
print("The code entered could not be found - Please re-enter")
gtinQuestion()
这里,如果循环内的if
永远不匹配,控件将从for
循环的末尾流出并执行else
语句。如果if
条件匹配,则循环中将break
,并且不会执行else
子句。
话虽如此,如果条件不匹配,你递归调用相同函数的方式可能不是一个好的设计。
这是另一种不使用递归函数调用的设计,并且不需要全局变量。
def gtinQuestion():
gtinNum = input("Please enter the GTIN-8 Code of the product you would like to order:")
while not (gtinNum.isdigit() == True and len(gtinNum) == 8):
gtinNum = input("Please enter the GTIN-8 Code of the product you would like to order:")
return gtinNum
def main():
gtinNumber = gtinQuestion()
function_that_needs_gtinNumber(gtinNumber)
答案 1 :(得分:0)
使用raw_input
代替input
,这样您就可以获得字符串而不是整数。
gtinNum = raw_input("Please enter the GTIN-8 Code of the product you would like to order:")
使用input
时,当您提供int
作为输入时,会收到int
,isdigit()
会导致错误...不确定为什么要执行根本没有通过测试。 (demo)
答案 2 :(得分:0)
你真正的问题在于,你没有明确地将你的计划的责任分开 - 无论是在你的脑海里还是在你的计划中。
明确定义您拥有的不同原则:
如果您在对自己面前的问题有清楚的了解之前编写代码,那么您将会在您所处的腌制中结束。根据您的个性,您可能希望从上到下或从下到上工作。有了这个问题,我会选择自上而下的解决方案。在它最广泛的情况下,您只需要运行应用程序,直到用户说他们想要退出。这是一个简单的程序:
wants_to_continue = True
while wants_to_continue:
answer = input('Would you like to continue? [Y/n]: ')
if answer.lower() in ('n', 'no', 'nyet', 'non'):
wants_to_continue = False
现在,在你的程序中,你从用户那里获得了一个GTIN并进行了两步验证(或者实际上是三个)。您首先要检查看起来是否像有效的GTIN一样,然后您要检查它是否真的找到了。但是如果您而首先加载有效的GTIN值,那么您实际上可以一举完成所有这些。
知道这一点,我会重新制定你的目标:
知道我们首先要加载您的数据,这是一种方法:
import csv
prices = {}
with open('prices.csv') as f: # or ChocolateCSV.csv
for row in csv.DictReader(f):
prices[row['GTIN']] = row
# You could replace this, and the prices = {} with
# a dict comprehension
# prices = {row['GTIN']:row for row in csv.DictReader(f)}
除非你有一个大量的产品数据库(数十万种产品 - 在合理的计算机上用这种方式甚至可以达到100k),这种方法将完全没问题。现在您已经掌握了数据,现在可以从用户那里获得GTIN#并查看它是否存在:
# Assuming that the prices were loaded by this point
wants_to_continue = True
while wants_to_continue:
answer = input('Would you like to continue? [Y/n]: ')
if answer.lower() in ('n', 'no', 'nyet', 'non'):
wants_to_continue = False
else:
gtin = input('What product number would you like to order? ')
product = prices.get(gtin)
print(product)
从这一点来说,你需要做的就是:
if product is None:
然后找不到产品)