输入有效数据时出错

时间:2016-06-08 17:03:34

标签: python validation csv

我正在编写的程序从用户那里获取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()

3 个答案:

答案 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作为输入时,会收到intisdigit()会导致错误...不确定为什么要执行根本没有通过测试。 (demo

答案 2 :(得分:0)

你真正的问题在于,你没有明确地将你的计划的责任分开 - 无论是在你的脑海里还是在你的计划中。

明确定义您拥有的不同原则:

  1. 从用户
  2. 获取有效的GTIN#
  3. 在CSV文件中搜索提供的GTIN#
  4. 如果GTIN#有效,请从用户那里获取有效数量
  5. 如果GTIN#无效,请获取另一个号码
  6. 向用户显示总价
  7. 允许用户重新启动。
  8. 如果您在对自己面前的问题有清楚的了解之前编写代码,那么您将会在您所处的腌制中结束。根据您的个性,您可能希望从上到下或从下到上工作。有了这个问题,我会选择自上而下的解决方案。在它最广泛的情况下,您只需要运行应用程序,直到用户说他们想要退出。这是一个简单的程序:

    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值,那么您实际上可以一举完成所有这些。

    知道这一点,我会重新制定你的目标:

    1. 从CSV文件中读取数据并将其转换为实用格式
    2. 要求用户提供有效的GTIN#
    3. 询问用户是否有效数量
    4. 计算并显示总价
    5. 询问用户是否要重复
    6. 知道我们首先要加载您的数据,这是一种方法:

      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:然后找不到产品)
      • 如果找到产品 ,请询问用户是否有效数量。
      • 制作并显示结果总数。