أنت تقسم b1
على مساحات واحدة ، وهذا يمكن أن يؤدي إلى قيم فارغة:
>>> '88 89 '.split(' ')
['88', '', '89', '']
إنها الأوتار الفارغة هنا هي التي تسبب int()
لرمي استثناء:
>>> int('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''
يستخدم str.split()
مع رقم حجة بدلا من ذلك ؛ ثم يتم تجريد مساحة بيضاء إضافية:
>>> '88 89 '.split()
['88', '89']
لديك بعض المشكلات الأخرى في الكود الخاص بك. ألق نظرة جيدة على:
def lab8():
userinput= "Lab8.txt"
lenoffile= len(userinput)
print "There is", lenoffile, "lines"
File= open (userinput, "r")
studentscores1= File.read()
studentlist= studentscores1.split("\n")
return studentlist, lenoffile
هنا، lenoffile
هو ليس عدد الخطوط في الملف. إنه عدد الأحرف في 'Lab8.txt'
; ؛ كلتا القيمتين يحدث أن تكون 8
, ، ولكن أضف أو إزالة بعض الخطوط من هذا الملف وسيكون الرقم خاطئًا لبقية التعليمات البرمجية الخاصة بك.
إذا كان من المفترض أن تحتفظ بهذه الأرقام مع الأسماء وكتابة الحسابات مرة أخرى ، فسيتعين عليك القيام ببعض الأعمال حفظ الأسماء معا.
فيما يلي نسخة بديلة لحل نفس المهمة:
outputfile = raw_input("What is the output filename? :")
with open('Lab8.txt') as infile, open(outputfile, 'w') as outtfile:
for name in infile:
scores = next(infile).split() # next() grabs the next line from infile here
scores = map(int, scores)
quiztotal = sum(scores[:4]) / 5
midtermtotal = sum(scores[5:7]) / 2
finaltotal = scores[7]
score = quiztotal * .3 + midtermtotal * .4 + finaltotal * .3
outfile.write(name)
outfile.write('{0:0.2f}\n'.format(score))