Ошибка типа: не поддерживается только при записи в файл, а не при печати
Я написал некоторый код (ниже), который работал нормально, пока я не добавил оператор, чтобы записать его в файл.
Я получаю ошибку TypeError: неподдерживаемые типы операндов для%: 'NoneType' и 'float', которые появляются в строке 43.
Что меня смущает, так это то, что он не выдает эту ошибку, когда я использую одни и те же операторы для печати только тогда, когда пишу. Я просмотрел других с этой ошибкой, но не могу понять, что происходит в моем случае.
Я попытался разбить его по каждой строке, чтобы увидеть, распространено ли оно в каждом операторе записи, и так ли это.
Если кто-нибудь может указать мне правильное направление, было бы здорово, спасибо.
import time
timeOfday = int((time.strftime("%H")))
if timeOfday < 11:
meal = "Breakfast"
elif timeOfday >=11 and timeOfday <= 5:
meal = "Lunch"
else:
meal = "Dinner"
fileName = meal + " " + (time.strftime("%d%m%Y")) +".txt"
print "Hello, Please let us know how much your bill was"
billAmount = float(raw_input(">>"))
print "How much would you like to tip?"
tipAmount = float(raw_input(">>"))
print "How many people are paying?"
peopleAmount = float(raw_input(">>"))
if tipAmount > 1:
tipAmount = tipAmount / 100
billAndTip = ((billAmount*tipAmount)+billAmount)
finalTip = (billAmount * tipAmount)
billDivided = (billAndTip / peopleAmount)
print "The total bill is %r" % (billAndTip)
print "Of which %r is the tip" % (finalTip)
if peopleAmount == 1:
print"Looks like you are paying on your own"
else:
print "Each Person is paying: %r" % (billDivided)
target = open(fileName, 'w')
# target.write("The bill was %r before the tip \n You tipped %r% \n The total bill was %r \n Split between %r people it was %r each") % (billAmount, tipAmount*100, billAndTip, peopleAmount, billDivided)
target.write("The bill was %r before the tip") % (billAmount)
target.write("\n")
target.write("You tipped %r%") % (tipAmount)
target.write("\n")
target.write("The total bill was %r") % (billAndTip)
target.write("\n")
target.write("Split between %r people it was %r each") % (peopleAmount, billDivided)
target.close()
print "This info has now been saved for you in the file %r" % (fileName)
2 ответа
target.write("The bill was %r before the tip") % (billAmount)
Здесь вы используете %
оператор с результатом target.write(...)
, target.write(...)
возвращается None
вот почему ошибка говорит то, что говорит.
Предположительно, вы хотите интерполировать сумму счета в строку, прежде чем передать ее target.write(...)
, Так сделай это!
target.write("The bill was %r before the tip" % (billAmount))
Другими словами, поскольку вы хотите выполнить интерполяцию перед записью, она помещается в скобках для вызова записи.
Я думаю, что вам нужно избежать %
подпишите здесь, сделав его двойным%:
target.write("The bill was %r before the tip \n You tipped %r%% \n The total bill was %r \n Split between %r people it was %r each") % (billAmount, tipAmount*100, billAndTip, peopleAmount, billDivided)
(Заметка "You tipped %r%% \n"
.)
@LPK указал на большую проблему. Каждая из строк такова:
target.write("You tipped %r%") % (tipAmount)
должно быть так:
target.write("You tipped %r%" % (tipAmount))