Ошибка типа: не поддерживается только при записи в файл, а не при печати

Я написал некоторый код (ниже), который работал нормально, пока я не добавил оператор, чтобы записать его в файл.

Я получаю ошибку 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))
Другие вопросы по тегам