2015-08-20 32 views
6

Python'a çok yeni geldim ve kendimi ilerledikçe öğretmeye çalışıyorum (pythonun en iyisi değil, zamana ihtiyacım var). Aldığım modüller Tkinter ve csv. Herhangi bir sorunuz olursa bana bildirinAttributeError: 'set' nesnesinin 'items' özelliği yok

Kısalmak adına, kodumun tamamını burada yayınlamayacağım ancak hatanın tamamını ekleyeceğim ve hatanın uyguladığı satırı göstereceğim. Aşağıdaki her şey MainApp adında bir sınıfta.

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) 

Ben programda koymadan önce çalışmış emin olmak için dışarı ayrı ayrı bu kodu yazmış ve mükemmel çalıştı, ama ben sınıfta koymak ve değişiklikleri yaptığında (düşündüm) ben yapmak için gereken çalışmadığı kod/değişken satırları. Böylece bu, yanlış bir şeyleri düzelteceğime inanmamı sağlıyor. Burada

hatadır:

hattı 328 hattı ifade eder
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' 

: "self.changes.items ya da (self.key, self.val)():"

“Ben” in varlığını veya yokluğunu değiştirdim (kendimi). tüm değişkenler için ama bunu işe alamıyorum.

DÜZENLEME: Böyle bakmak için kod değişmiş: yorum göre

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) 

ama hala aynı hatayı alıyorum.

+0

Eh hata. Bu yüzden, '.items()' i, self.changes.items() 'i kullanarak deneyin ve kaldırın. Http://docs.python.org/3/library/stdtypes.html#dictionary-view-objects Ayrıca, neden yaptınız? do 'self.changes = {self.key: self.val}'? Bir sözlüğe başvurmaya çalışıyorsanız, 'self.key: self.val' ifadesinin eklenmesi gerekli değildir, çünkü self.changes = {}' yeterlidir. – awbemauler

+0

.items() öğesini çıkardığımda, "paketinden çıkarmak için 0'dan fazla değere gerek" yazan bir ValueError döndürür. Sözlüğü boş bırakmayı deneyeceğim. – MTMA

+0

Evet, çünkü anahtarınızda ve değerinizde hiçbir şeyiniz yok. Bu değişkenleri hiçbir şey olmadan başlattın. – awbemauler

cevap

12

son güncellenen koddan görebileceğiniz gibi - kullandığınız beri, siz yukarıdaki self.changes tanımlarken

self.changes = {"MTMA",123} 

, aslında bir dizi değil, bir sözlük tanımlıyorsanız '' (virgül) Kolon yerine, gerçek kodunuzda virgül değil virgül kullanıyorsunuzdur.

Örnek, aralarında iki nokta üst üste kullanın değeri gibi başlıca olarak "MTMA" ve 123 ile bir sözlük tanımlamak için -

self.changes = {"MTMA":123} 

yanı gerçek kodunda benzer yapın.

ne istediğini boş sözlüğü ise, olarak tanımlamak - kendisi öğeler `denilen hiçbir özellik()` yoktur söylüyor

self.changes = {} 
+0

Ahhhhh. Şimdi çok açık. Ne kadar utanç verici ... Yardımın için teşekkürler! – MTMA

İlgili konular