2017-04-08 6 views
2

Ich arbeite an der Erstellung eines kurzen, einfachen Programms für eine Nonprofit-Spendenaktion, um Ticketnummern beim Einchecken zu überprüfen, um sicherzustellen, dass keine doppelten Tickets eingelöst werden. Ich verwende Python 3.4.3 auf einem Windows 10-Rechner. Sobald das Programm abgeschlossen ist, wird es auf einem Raspberry Pi mit Touchscreen bei der Spendenaktion verwendet werden.TypeError: 'DictWriter' -Objekt ist nicht iterierbar

Ich habe ein paar verschiedene Methoden ausprobiert, um die Liste zu erstellen, zu speichern und nach Duplikaten zu suchen. Idealerweise wird die Liste in einer CSV-Datei gespeichert, aber ein einfacher Text oder ein anderes Format ist auch in Ordnung.

Können Sie mir mit dem Traceback-Fehler helfen (TypeError: 'DictWriter' -Objekt ist nicht iterierbar) aufgrund der Looping-Funktion, um Ticket # gegen eine in einer Datei gespeicherte Liste zu prüfen, um sicherzustellen, dass keine doppelten Tickets eingelöst werden?

Vielen Dank im Voraus für Ihre Hilfe!

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)) 

Antwort

5

Hmm, ich denke, Sie könnten das ein wenig zu kompliziert machen! Für so etwas gibt es wirklich keinen Grund, zu all diesen Schwierigkeiten zu gehen. Dies ist ein großartiger Ort, um ein Wörterbuch zu verwenden, und für etwas mit nur zwei Eingaben, der ID und der Check-in-Zeit, können Sie einfach ein .txt-Protokoll erstellen. Ich habe das Gefühl, dass dies mehr von dem sein könnte, wonach Sie suchen.

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

Objekte der csv.DictWriter Klasse sind nicht durchsuchbar, heißt Sie nicht über sie wie würden Sie ein Wörterbuch, Liste laufen kann oder sogar String, damit Ihre Fehlermeldung. Es speichert nicht die Daten, die Sie zuvor in eine Datei geschrieben haben, nur die Datei, in die Sie geschrieben haben, speichert diese Daten.

Um Ihr Ziel zu erreichen, können Sie zwei Dinge tun: entweder öffnen Sie Ihre CSV-Datei jedes Mal, wenn ein neues Ticket validiert werden muss, und prüfen Sie, ob die Ticketnummer vorhanden ist oder - da Sie relativ kleine Datenmengen verwenden - Speichern Sie ein Wörterbuch im Speicher, und schreiben Sie es nur am Ende der Verwendung aus, und überprüfen Sie das, wenn das Ticket gültig ist.

Verwandte Themen