2016-04-10 59 views
-2

Bir sınav yazıyorum ve öğrenci sınavı tamamladıktan sonra, puanları kaydederken, bir öğrencinin son üç puanının kaydedildiğinden emin olmaya çalışıyorum. isimler. Daha önce bir sınavı tamamlamamışlarsa, metin dosyasında onlar için yeni bir satır yazılır.TypeError '_io.TextIOWrapper' nesnesi, öğe atamasını desteklemiyor

filename = (str(class_number) + 'txt') 
with open(filename, 'a') as f: 
    f.write(str(name) + " : " + str(score) + '\n') 
with open(filename) as f: 
    lines = [line for line in f if line.strip()] 
    lines.sort() 

with open(filename) as f: 
    f.seek(0) 
    scores = f.readline() 
    from collections import deque 
    for line in scores: 
     score= int(score) 
     if name not in f: 
      f[name] = deque(maxlen=3) 
     temp_q = filename[name] 
     temp_q.append(str(score)) 
     filename[name] = temp_q 

    filehandle = open (filename, 'w') 
    for key,values in filename.iteritems(): 
     filehandle.write(name + ',') 
     filehandle.write (','.join(list(values)) + '\n') 
    filehandle.close() 

Ve bu hatadır:

f[name] = deque(maxlen=3) 

TypeError '_io.TextIOWrapper' object does not support item assignment 

cevap

1

Burada açık dosya nesnesine f öğeleri atamaya çalışıyorsunuz: Size çalışıyoruz bana ne net değil

f[name] = deque(maxlen=3) 

Buraya ulaşmak için, ancak bir dosya nesnesi bir eşleme değildir (bir sözlük).

Önce siz bir sözlüğüne dosyanın içeriğini dışarı ayrıştırmak zorunda değişiklik yapmak ve sonucu geri yazmak isterim: Bu listeye adından bir sözlük eşlemesi oluşturur

scores = {} 
with open(filename) as f: 
    for line in f: 
     line = line.strip() 
     if not line: 
      continue 
     name, _, score = line.partition(':') 
     scores.setdefault(name.strip(), []).append(int(score)) 

puan; Dosyanız her isim için birden fazla puan içerebileceğinden.

+0

Yardımınız için minnettarım ve eğer r kodu uygularsam kodun çalışacağına inanıyorum ama elde ettiğim şey son üç puanın bir öğrenci adına kaydedilmiş olmasıdır, böylece Öğrenci zaten bir isim girerse metin dosyasında sadece son skora ekler, ancak eğer bir dosyada 4 olacak noktaya gelirse ilk skoru atar ve sadece en son üçü kaydeder. – user6173661

+0

@ user6173661: Bu görev için GSCE gereksinimlerini biliyorum, evet. Ancak bunu kendi kendinize çözmeniz gerekecek; Bu özel problemde size yardımcı oldum, tam görev çözümüne giden yolda bir yol noktası. –