2012-01-01 3 views
11

Я начал изучать Python с LPTHW, и я получил на осуществление 16:Python: Как написать несколько строк в одной строке?

http://learnpythonthehardway.org/book/ex16.html

И чувствую себя идиотом, потому что я не могу понять одну из, казалось бы, простой «дополнительный кредит» которые требуют следующее:

target.write(line1) 
target.write('\n') 
target.write(line2) 
target.write('\n') 
target.write(line3) 
target.write('\n') 

Для уплотнения в одной строке кода. Я пробовал некоторые из следующих действий:

target.write(line1 \n, line2 \n, line3 \n) 

Или:

target.write('line1 \n, line2 \n, line3 \n') 

Или:

target.write(%r \n, %r \n, %r \n) % (line1, line2, line3) 

Я просто не могу заставить его переписать line1, line2 и line3 строки все в одной строке. И я пробовал разные комбинации с запятыми и без них, кавычки и т. Д. У меня все время возникают различные ошибки, такие как Invalid Syntax или у меня слишком много аргументов.

Любая помощь (и пояснение позади) была бы весьма признательна. Благодаря!

ответ

42
target.write(line1 \n, line2 \n, line3 \n) 

'\ n' имеет смысл только внутри строкового литерала. Без кавычек у вас нет строковых литералов.

target.write('line1 \n, line2 \n, line3 \n') 

Хорошо, теперь все является строковым литералом. Но вы хотите, чтобы строка1, строка2, строка3 не были строковыми литералами. Вам нужны эти выражения в качестве выражений python для ссылки на переменные, о которых идет речь. В принципе, вам нужно помещать кавычки вокруг строк, которые на самом деле являются текстовыми, как «\ n», но не вокруг переменных.Если вы сделали это, вы, возможно, получили что-то вроде:

target.write(line1 '\n' line2 '\n' line3 '\n') 

2 2 Что такое? Ничего. Вы должны указать python, как объединить две части. Таким образом, вы можете иметь 2 + 2 или 2 * 2, но 2 2 не имеет никакого смысла. В этом случае мы используем добавить, чтобы объединить две строки

target.write(line + '\n' + line2 + '\n' + line3 + '\n') 

Двигаясь дальше,

target.write(%r \n, %r \n, %r \n) % (line1, line2, line3) 

Опять \n имеет смысл только внутри строкового литерала. Оператор%, когда используется для создания строк, берет строку в левой части. Таким образом, вам нужна вся эта деталь форматирования внутри строки.

target.write('%r \n', '%r \n', '%r \n') % (line1, line2, line3) 

Но это то, что производит 3 строковых литерала, вы только хотите. Если вы сделали это, пишут жаловался, потому что excepts одну строку, а не 3. Таким образом, вы, возможно, пытался что-то вроде:

target.write('%r \n%r \n%r \n') % (line1, line2, line3) 

Но вы хотите, чтобы написать line1, line2, line3 к файлу. В этом случае вы пытаетесь форматировать после того, как запись уже завершена. Когда python выполнит это, он запустит target.write в первый раз:

None % (line1, line2, line3) 

Это не поможет. Чтобы исправить это, мы должны поставить %() внутри .write()

target.write('%r\n%r\n%r\n' % (line1, line2, line3)) 
+0

Спасибо за этот исчерпывающий ответ/объяснение. Я действительно понимаю не только правильный ответ, но и неправильные и то, что здесь происходит. Спасибо! – jstacks

+0

@jstacks, тогда моя миссия здесь завершена! –

5

Ваша последняя попытка выглядит многообещающей. Он должен выглядеть следующим образом:

"%s \n %s \n %s" % (line1, line2, line3) 

это относится оператор % к строке (с 3 %s заполнителей) и набор значений для замены (здесь строки). Результатом является форматированная строка.

Таким образом, вы должны были бы обернуть, что в функции, которая принимает результат:

target.write("%s \n %s \n %s" % (line1, line2, line3)) 
+0

Я действительно не знаю, o дать вам или «+» ответ на галочку. Однако я бы никогда не думал об использовании «+», но это хороший урок обучения. Скобка здесь другая, и я ценю ее. Когда я использую этот метод, мне кажется, что я возвращаю котировки ... как бы это исправить? Поскольку их удаление вызывает синтаксическую ошибку. – jstacks

+0

@jstacks, если вы хотите помочь с синтаксическими ошибками, всегда показывайте нам код и синтаксическую ошибку. –

+0

Цитаты были из-за того, что я продолжал использовать% r, используя исправления% s, которые ... но почему? Я знаю 's' означает, что он будет специально нацелен на строку. Но не работает ли более широко и все еще возвращает строку? Почему он не работает одинаково? Кроме того, при использовании этого метода строка2 и строка3 слегка отступаются. Почему это происходит и каково будет исправление? – jstacks

4

Вот один из способов:

target.write(line1 + '\n' + line2 + '\n' + line3 + '\n') 

Причина следующее не работает

target.write(line1 \n, line2 \n, line3 \n) 

Это line1 является переменной (обратите внимание, что это не котировка), но '\n' - это строка буквально (поскольку это в кавычках). Оператор добавления перегружен для строк, чтобы объединить их.

Причина этого не работает:

target.write('line1 \n, line2 \n, line3 \n') 

Это потому, что line1 является переменной. Когда вы помещаете его в кавычки, он больше не рассматривается как переменная.

+0

Я пробовал (строка1 '\ n', строка 2 '\ n', line3 '\ n'), и это тоже не сработало (также пробовали с запятыми между всеми). Любая причина, почему + работает, но запятая нет? Я полагаю, что он рассматривает все между запятыми, поскольку это собственный аргумент, а не только один с отдельными переменными? Итак, + смягчает это тогда? – jstacks

+0

@jstacks запятые в вызове метода являются разделителями для аргументов, так что да он рассматривает его как отдельные аргументы, когда ожидается только один. Пространство между просто бессмысленно в Python, так что это ошибка. '+' имеет более высокий приоритет в порядке операций, чем функция оценки, и, как я уже упоминал выше, плюс для строки является конкатенацией. Например, «print» hello «+» world »на 100% идентичен« print »helloworld». Или для чисел 'print 1 + 1' идентичен' print 2', потому что плюс происходит перед печатью. – Davy8

+0

Спасибо. Между тем, что вы и Уинстон выложили, я определенно узнал кучу. Stackoverflow является удивительным. – jstacks

2

ниже линии работает для меня,

target.write(line1 + line + line2 + line + line3 + line) 

До этого я добавил

line = '\n' 

мой код как:

from sys import argv 
script, filename = argv 
print 'Appending process starts on: %r' % filename 
target = open(filename, 'a') 
print 'Enter the contents:\t' 
line1 = raw_input('Next:\t') 
line2 = raw_input('Next:\t') 
line3 = raw_input('Next:\t') 
line = '\n' 
target.write(line1 + line + line2 + line + line3 + line) 
print 'Thank you !' 
Смежные вопросы