'How can I break up this long line in Python?
How would you go about formatting a long line such as this? I'd like to get it to no more than 80 characters wide:
logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))
Is this my best option?
url = "Skipping {0} because its thumbnail was already in our system as {1}."
logger.info(url.format(line[indexes['url']], video.title))
Solution 1:[1]
Consecutive string literals are joined by the compiler, and parenthesized expressions are considered to be a single line of code:
logger.info("Skipping {0} because it's thumbnail was "
"already in our system as {1}.".format(line[indexes['url']],
video.title))
Solution 2:[2]
Personally I dislike hanging open blocks, so I'd format it as:
logger.info(
'Skipping {0} because its thumbnail was already in our system as {1}.'
.format(line[indexes['url']], video.title)
)
In general I wouldn't bother struggle too hard to make code fit exactly within a 80-column line. It's worth keeping line length down to reasonable levels, but the hard 80 limit is a thing of the past.
Solution 3:[3]
You can use textwrap module to break it in multiple lines
import textwrap
str="ABCDEFGHIJKLIMNO"
print("\n".join(textwrap.wrap(str,8)))
ABCDEFGH
IJKLIMNO
From the documentation:
textwrap.wrap(text[, width[, ...]])
Wraps the single paragraph in text (a string) so every line is at most width characters long. Returns a list of output lines, without final newlines.Optional keyword arguments correspond to the instance attributes of
TextWrapper, documented below. width defaults to70.See the
TextWrapper.wrap()method for additional details on how wrap() behaves.
Solution 4:[4]
For anyone who is also trying to call .format() on a long string, and is unable to use some of the most popular string wrapping techniques without breaking the subsequent .format( call, you can do str.format("", 1, 2) instead of "".format(1, 2). This lets you break the string with whatever technique you like. For example:
logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))
can be
logger.info(str.format(("Skipping {0} because its thumbnail was already"
+ "in our system as {1}"), line[indexes['url']], video.title))
Otherwise, the only possibility is using line ending continuations, which I personally am not a fan of.
Solution 5:[5]
Solution without extra packages load:
def split_by_len(txt: str, l: int, sep: str or None='\n') -> str or list:
"""
txt: str text
l: split length (symbols per split)
sep: separate string or None for list of strs
"""
spl_list = [txt[i * l : i * l + l] for i in range(len(txt) // l + 1)]
return spl_list if sep==None else sep.join(spl_list)
Example 1:
print(split_by_len(txt='XXXXX', l=2, sep='\n'))
XX
XX
X
Example 2:
print(split_by_len(txt='XXXXX', l=2, sep=' '))
XX XX X
Example 3:
print(split_by_len(txt='XXXXX', l=2, sep=None))
['XX', 'XX', 'X']
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Ignacio Vazquez-Abrams |
| Solution 2 | bobince |
| Solution 3 | |
| Solution 4 | Simon Alford |
| Solution 5 |
