2017-04-08 41 views
2

我正在为非营利募捐人创建一个简短的程序,以验证客人入住时的门票号码,以确保没有重复的门票可以兑换。我在Windows 10机器上运行Python 3.4.3。一旦该计划完成,它将用于筹款活动中带有触摸屏的Raspberry Pi。TypeError:'DictWriter'对象不可迭代

我已经尝试了几种不同的方法来构建列表,保存它并搜索重复项。理想情况下,列表将存储在CSV文件中,但纯文本或其他格式也可以。

由于循环函数,您可以帮助我处理跟踪错误(TypeError:'DictWriter'对象不可迭代),以检查票据#与存储在文件中的列表,以确保没有重复票据被兑换?

非常感谢您的帮助!

version = "v1.4" 
fname="tickets.csv" 
import csv 
import datetime 
import os.path 
print("\nWelcome to TicketCheck", version) 
extant = os.path.isfile(fname) 
with open(fname, 'a', newline='') as csvfile: 
    fieldnames = ['ticketid', 'timestamp'] 
    ticketwriter = csv.DictWriter(csvfile, fieldnames=fieldnames) 
    if extant == False: 
     ticketwriter.writeheader() 
    while True: 
     ticket = "" 
     print("Please enter a ticket # to continue or type exit to exit:") 
     ticket = str(input()) 
     if ticket == "": 
      continue 
     if ticket == "exit": 
      break 
     print("You entered ticket # %s." % (ticket)) 
     print("Validating ticket...") 
     for row in ticketwriter: 
      if row[0] == ticket: 
       print("\n\n\n===== ERROR!!! TICKET # %s ALREADY CHECKED IN =====\n\n\n" % (ticket)) 
       continue 
     time = datetime.datetime.now() 
     print("Thank you for checking in ticket # %s at %s \n\n\n" % (ticket, time)) 
     print("Ticket is now validated.") 
     ticketwriter.writerow({'ticketid': ticket, 'timestamp': time}) 
     csvfile.flush() 
     continue 
csvfile.close() 
print("All your work has been saved in %s.\n Thank you for using TicketCheck %s \n" % (fname, version)) 

回答

5

嗯,我想你可能会过度复杂这一点!对于这样的事情,真的不需要去解决所有的麻烦。这是使用字典的好地方,对于只有两个输入的东西,即id和签入时间,您可以轻松创建.txt日志。我感觉这可能更多的是你正在寻找的东西。

import time 
go = True 
while go: 
    the_guestlist = {} 
    the_ticket = input().strip() 
    file = open('somefile.txt', 'r') 
    for line in file: 
     my_items = line.split(',') 
     the_guestlist[my_items[0]] = my_items[1] 
    file.close() 
    if the_ticket in the_guestlist.keys(): 
     print("Sorry, that ticket has been entered at {}".format(the_guestlist[the_ticket])) 
    elif the_ticket == 'exit': 
     go = False 
     print('Exiting...') 
    else: 
     the_guestlist[the_ticket] = '{}'.format(time.asctime()) 
     file = open('somefile.txt', 'a') 
     file.write(the_ticket +','+the_guestlist[the_ticket]+'\n') 
     file.close() 
0

csv.DictWriter类的对象是不迭代,你不能对他们进行迭代,就像您一本字典,列表,甚至是字符串,因此您的错误信息。它不存储先前写入文件的数据,只存储您写入的用于存储该数据的文件。

要实现您的目标,您可以做两件事:每次需要验证新票时打开CSV文件,并检查票号是否存在,或者 - 由于您使用的数据量相对较小 - 将字典存储在内存中,并且只在使用结束时将其写出,并根据该字典检查票证是否有效。