String Concatenation:在Python代码中放入大量文本

时间:2013-01-29 17:38:14

标签: python string python-2.7

假设我有一大块文字,比如说

  

喜马拉雅朝圣的第三次也是最后一次轮换探索了   神圣空间的主题与一对宏伟的大曼荼罗   绘画,立体的二维表征   特定神灵所在的建筑空间。约会到   十四世纪和十六世纪,这些画作代表着   鲜艳的色彩,神灵Hevajra的宇宙观。其他几个   观看的绘画描绘了各种藏族命令的历史教师。

在Java中我可以把它写成

"The third and final rotation of Himalayan Pilgrimage explores "
+ "the theme of Sacred Space with a pair of magnificent large "
+ "mandala paintings, two-dimensional representations of a "
+ "three-dimensional architectural space where a specific "
+ "deity resides. Dating to the fourteenth and sixteenth "
+ "centuries, these paintings represent, in vivid colors, "
+ "a cosmology of the deity Hevajra. Several other paintings"
+ " on view depict historic teachers of various Tibetan orders."

然而,在Python中,如果我这样做,我会对加号+抱怨。相反,如果我使用''',由于缩进(缩进以便代码易于阅读),我会得到一堆前导空格。

有没有人知道这个问题的解决方案:如何在不产生空格的情况下将大量文本粘贴到Python代码中?

我正在寻找的答案不是:将整篇文章放在一行

同样,我需要添加跨越多行的文本,而不会产生额外的空白区域。

3 个答案:

答案 0 :(得分:14)

当您使用三重引号字符串时,没有缩进:

class SomeClass(object):
    def somemethod(self):
        return '''\
This text
does not need to be indented
at all.
In this text, newlines are preserved.
'''
        # but do continue the next line at the right indentation.

您也可以使用括号自动连接字符串:

foo = (
    "this text will be "
    "joined into one long string. "
    "Note that I don't need to concatenate these "
    "explictly. No newlines are included\n"
    "unless you insert them explicitly."
)

因为python会自动将一个表达式中的连续字符串连接在一起(参见String literal concatenation)。

您仍可以使用+符号明确地连接字符串,但请使用括号使其成为一个表达式:

foo = (
    "this text will be " +
    "joined into one long string. " + 
    "It is concatenated " +
    "explictly using the `+` operator."
)

另一种方法是在行尾之前使用反斜杠:

foo = "This is not " \
    "recommended"

但我发现使用括号和字符串文字串联更易读。

答案 1 :(得分:0)

有几种方法可以做到这一点,当你有多个字符串而它们之间只有空格时,编译器会从中创建一个字符串,如前所述。你也可以使用\来逃避行尾。就像这样。

SomeText="Something" \
         "Something else"

SomeText="Something" + \
         "Something else"

缺点是你必须记住每一行\。作为一般规则,使用+将多个字符串连接在一起是一个坏主意,因为它为它找到的每个+生成字符串的副本,因为字符串是不可变的,这使得它需要很长时间时间。而是考虑使用str.join,就像这样。

SomeText="\n".join(["Something",
                  "Something else",
                  "Last Item"])

请注意,这具有额外的优势,您可以根据您正在做的事情(换行符或无字符)将" "替换为其他分隔符。

答案 2 :(得分:0)

textwrap.dedent将清理那些前导空格,而不会弄乱你的源缩进。