Как написать несколько строк в одну строку? - PullRequest
14 голосов
/ 01 января 2012

Я начал изучать Python с LPTHW и приступил к упражнению 16:

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 находятся в одной строке.И я пробовал различные другие комбинации с запятыми, кавычками и т. Д. И без них. У меня постоянно появляются разные ошибки, например, неверный синтаксис или слишком много аргументов.

Ответы [ 5 ]

45 голосов
/ 01 января 2012
target.write(line1 \n, line2 \n, line3 \n)

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

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

Хорошо, теперь все является строковым литералом.Но вы хотите, чтобы line1, line2, line3 не были строковыми литералами.Вы нуждаетесь в них как в выражениях python, чтобы ссылаться на рассматриваемые переменные.По сути, вы должны помещать кавычки вокруг строк, которые на самом деле являются текстом типа \ n, но не вокруг переменных.Если бы вы сделали это, вы могли бы получить что-то вроде:

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

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

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 строковых литерала, вам нужен только один.Если вы сделали это, напишите жалобу, потому что она исключает одну строку, а не 3. Таким образом, вы могли попробовать что-то вроде:

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

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

None % (line1, line2, line3)

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

target.write('%r\n%r\n%r\n' % (line1, line2, line3))
6 голосов
/ 01 января 2012

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

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

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

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

target.write("%s \n %s \n %s" % (line1, line2, line3) )
4 голосов
/ 01 января 2012

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

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 является переменной. Когда вы помещаете его в кавычки, он больше не рассматривается как переменная.

2 голосов
/ 17 апреля 2015

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

 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 !'
1 голос
/ 17 марта 2019

Автор предложил использовать форматы, строки и escape-символы, поэтому работает следующее.Это реализует f-строки Python:

target.write(f"{line1} \n{line2} \n{line3} \n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...