简体   繁体   中英

How to indent the contents of a multi-line string?

I'm using the python cog module to generate C++ boilerplate code, and it is working great so far, but my only concern is that the resulting code, which is ugly by itself, is made worse by the fact that it's not indented. I'm too lazy to get the indentation right in the string generation function, so I'm wondering if there is a Python util function to indent the content of a multi-line string?

You can indent the lines in a string by just padding each one with proper number of pad characters. This can easily be done by using thetextwrap.indent() function which was added to the module in Python 3.3. Alternatively you could use the code below which will also work in earlier Python versions.

try:
    import textwrap
    textwrap.indent
except AttributeError:  # undefined function (wasn't added until Python 3.3)
    def indent(text, amount, ch=' '):
        padding = amount * ch
        return ''.join(padding+line for line in text.splitlines(True))
else:
    def indent(text, amount, ch=' '):
        return textwrap.indent(text, amount * ch)

text = '''\
And the Lord God said unto the serpent,
Because thou hast done this, thou art
cursed above all cattle, and above every
beast of the field; upon thy belly shalt
thou go, and dust shalt thou eat all the
days of thy life: And I will put enmity
between thee and the woman, and between
thy seed and her seed; it shall bruise
thy head, and thou shalt bruise his
heel.

3:15-King James
'''

print('Text indented 4 spaces:\n')
print(indent(text, 4))

Result:

Text indented 4 spaces:

    And the Lord God said unto the serpent,
    Because thou hast done this, thou art
    cursed above all cattle, and above every
    beast of the field; upon thy belly shalt
    thou go, and dust shalt thou eat all the
    days of thy life: And I will put enmity
    between thee and the woman, and between
    thy seed and her seed; it shall bruise
    thy head, and thou shalt bruise his
    heel.

    3:15-King James

If you have a leading newline:

Heredocs can contain a literal newline, or you can prepend one.

indent = '    '

indent_me = '''
Hello
World
''' 
indented = indent_me.replace('\n', '\n' + indent)
print(indented)

Here is it shown in pprint dump:

>>> pprint(indented)

' Hello\\n World\\n '

Awkward, but works


If you do not have a leading newline:

indent = '    '

indent_me = '''\
Hello
World
''' 
indented = indent + indent_me.replace('\n', '\n' + indent)
print(indented)

Optional, trim first newline and trailing spaces/tabs

.lstrip('\n').rstrip(' \t')

为什么不通过命令行代码格式化程序(例如 astyle)来管道输出?

There is a script located in the python Tools/Scripts/ directory which is primarily for fixing the indentation of entire python files. However, you can easily tweak the script a little and apply it to sections/lines of code, or other types of files.

The script is also located online, here:
http://svn.python.org/projects/python/trunk/Tools/scripts/reindent.py

Or, as a module here:
http://pypi.python.org/pypi/Reindent/0.1.0

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM