2015-08-20 20 views
6

Sono molto nuovo in Python e ho cercato di insegnarmi mentre andavo (non il metodo migliore in profondità in Python ma per il tempo ho bisogno anche io). I moduli che ho importato sono Tkinter e CSV. Fatemi sapere se avete domande,AttributeError: l'oggetto 'set' non ha attributo 'items'

Per brevità non invierò qui il mio intero codice ma includerò l'intero errore e indicherò la riga a cui si applica l'errore. Tutto ciò che è sotto è in una classe chiamata MainApp.

def SubmitEdit(self): 
    self.key="" 
    self.val="" 
    new_rows = [] 
    self.changes = {self.key:self.val} 
    with open("info.csv",'rb') as f: 
     reader = csv.reader(f): 
     for row in reader: 
      new_row = row 
      for field in row: 
       if field == "NAME": 
        print "groovy" 
      for (self.key,self.val) in self.changes.items(): 
       new_row = [ x.replace(self.key,self.val) for x in new_row] 
      new_rows.append(new_row) 
    with open("info.csv","wb") as f: 
     writer = csv.writer(f): 
     writer.writerows(new_rows) 

ho scritto questo codice separatamente fuori per assicurarsi che ha funzionato prima di metterlo nel programma e ha funzionato perfettamente, ma quando ho messo in classe e fatto le modifiche (ho pensato) avevo bisogno di fare per le linee di codice/variabili che non ha funzionato. Quindi questo mi porta a credere che sto solo correggendo qualcosa in modo errato.

Ecco l'errore:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python27\lib\lib-tk\Tkinter.py",line 1536, in__call__ 
     return self.func(*args) 
    File "C:\Python27\draft.py", line 328, in SubmitEdit 
     for (self.key,self,val) in self.changes: 
AttributeError: 'set' object has no attribute 'items' 

Dove linea 328 si riferisce alla linea: "o (self.key, self.val) in self.changes.items():"

Ho cambiato in giro (mi sento come) la presenza o l'assenza di "sé". per tutte le variabili ma non riesco a farlo funzionare.

EDIT: ho modificato il codice per assomigliare a questo:

def SubmitEdit(self): 
    new_rows = [] 
    self.changes = {"MTMA",123} 
    with open("info.csv",'rb') as f: 
     reader = csv.reader(f): 
     for row in reader: 
      new_row = row 
      for field in row: 
       if field == "NAME": 
        print "groovy" 
      for (key,val) in self.changes.items(): 
       new_row = [ x.replace(key,val) for x in new_row] 
      new_rows.append(new_row) 
    with open("info.csv","wb") as f: 
     writer = csv.writer(f): 
     writer.writerows(new_rows) 

come per i commenti, ma ancora ottenere lo stesso errore esatto.

+0

Bene l'errore stesso sta dicendo non v'è alcun attributo chiamato 'articoli()'. Quindi prova a rimuovere '.items()' da 'self.changes.items()' http://docs.python.org/3/library/stdtypes.html#dictionary-view-objects Inoltre, perché hai do 'self.changes = {self.key: self.val}'? Se stai solo provando a fare riferimento a un dizionario, aggiungere 'self.key: self.val' non è necessario poiché' self.changes = {} 'è sufficiente. – awbemauler

+0

Quando togli il file .items() restituisce un valore ValueError che dice "ha bisogno di più di 0 valori per decomprimere". Proverò a lasciare il dizionario vuoto. – MTMA

+0

Sì, perché non hai nulla nella tua chiave e valore. Hai iniziato quelle variabili con niente. – awbemauler

risposta

12

Come si può vedere dalla più recente codice aggiornato -

self.changes = {"MTMA",123} 

Quando si definisce self.changes come sopra, in realtà si sta definendo un insieme, non un dizionario, dal momento che è stato utilizzato '' (virgola) invece di due punti, sono abbastanza sicuro nel tuo codice che stai usando la virgola stessa, non i due punti.

Per definire un dizionario con "MTMA" come chiave e 123 come valore, utilizzare i due punti tra di loro, Esempio -

self.changes = {"MTMA":123} 

fare in modo simile nel codice attuale e.

Se quello che vuoi è un dizionario vuoto, definirlo come -

self.changes = {} 
+0

Ahhhhh. Così ovvio ora. Che imbarazzo ... Grazie per l'aiuto! – MTMA

Problemi correlati