Total Python Noob: почему это не работает? - PullRequest
0 голосов
/ 29 августа 2011

Я работаю через Learn Python на нелегком пути и пытаюсь понять это, а не просто отбить. Я застрял на Упражнении 16, как уже обсуждалось на SO здесь:

Очень простой вопрос по Python (строки, форматы и экранированные символы)

но я все еще пытаюсь выяснить, почему этот подход не работает:

from sys import argv

script, filename = argv


print "Attempting to open the file now." 
print open(filename).read()

print "We're going to erase %r." % filename
print "If you don't want that, hit CTRL-C."

print "If you do want that, hit RETURN." 

raw_input("?")

print "Opening the file..."
target = open(filename, 'w')

print "Truncating the file. Goodbye!"
target.truncate()

print "Now I'm going to ask you for three lines." 

line1 = raw_input("line 1: ")
line2 = raw_input("line 2: ")
line3 = raw_input("line 3: ")

print "I'm going to write these to the file." 

linebreak = "\n"
target.write("%s %s %s %s %s %s") % (line1, linebreak, line2, linebreak, line3, linebreak)

target.write("the ending line")

print "And finally, we close it." 
target.close()

Я установил значение для перевода строки, и я вызываю значения line1, line2 и перенос строки с помощью% s в команде target.write. Разве он не должен анализироваться как "line1 \ n line2 \ n line3 \ n" при чтении?

Это, вероятно, эквивалентно тому, что ребенок спрашивает, что держит небо или что-то в этом роде, и я прошу прощения за то, что был довольно толстым. Спасибо!

Ответы [ 4 ]

9 голосов
/ 29 августа 2011
target.write("%s %s %s %s %s %s") % (line1, linebreak, line2, linebreak, line3, linebreak)

должно быть

target.write("%s %s %s %s %s %s" % (line1, linebreak, line2, linebreak, line3, linebreak))

но было бы лучше записать как:

target.write(' '.join(line1, linebreak, line2, linebreak, line3, linebreak))
7 голосов
/ 29 августа 2011

Предполагая, что вы получаете

TypeError: unsupported operand type(s) for %: 'NoneType' and 'tuple'

Что вам нужно, это

target.write("%s %s %s %s %s %s" % (line1, linebreak, line2, linebreak, line3, linebreak))

То есть вам нужно использовать оператор % для строки, а не для результата target.write(). Сообщение об ошибке может иметь для вас больше смысла, если вы понимаете, что target.write() возвращает None типа NoneType.

0 голосов
/ 21 июля 2017

Я очень опоздал, но вы тоже делаете это: target.write("{line1}\n{line2}\n{line3}\n").format(line1=line1,line2=line2,line3=line3)

0 голосов
/ 17 марта 2014

Я сделал это пару дней назад, в упражнении 22 он попросит вас записать все, что вы узнали до сих пор, и запомнить его.

Ранее он просил вас прокомментировать каждую строку, чтобы объяснить, что она делает. Вероятно, это действительно хорошая привычка, пока вы просто не знаете, что делают строки, не думая о них.

Также будьте осторожны с тем, как вы излагаете вещи.

Если вы хотите стать программистом, вам нужно начать говорить как один и использовать словарь.

line1, line2, line3, перевод строки называются переменными. Вы временно присваиваете им / присваиваете им значения, используя = (оператор присваивания).

Запись - это функция. Функции в Python принимают аргументы между (). Все аргументов должны соответствовать внутри (). Если вы написали это так, например, я уверен, что это не сбил бы тебя с толку.

stuffIWantToPrint = line1 + lb + line2 + lb+ line3 + lb #all strings together 
target.write(stuffIWantToPrint) #pass the big string to write
...