In my project, I have a bunch of strings that are read in from a file. Most of them, when printed in the command console, exceed 80 characters in length and wrap around, looking ugly.
I want to be able to have Python read the string, then test if it is over 75 characters in length. If it is, then split the string up into multiple strings, then print one after the other on a new line.
I also want it to be smart, not cutting off full words. i.e. "The quick brown <newline> fox..." instead of "the quick bro<newline>wn fox...".
I’ve tried modifying similar code that truncates the string after a set length, but just trashes the string instead of putting it in a new line.
What are some methods I could use to accomplish this?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
You could use textwrap module:
>>> import textwrap >>> strs = "In my project, I have a bunch of strings that are read in from a file. Most of them, when printed in the command console, exceed 80 characters in length and wrap around, looking ugly." >>> print(textwrap.fill(strs, 20)) In my project, I have a bunch of strings that are read in from a file. Most of them, when printed in the command console, exceed 80 characters in length and wrap around, looking ugly.
help on textwrap.fill:
>>> textwrap.fill? Definition: textwrap.fill(text, width=70, **kwargs) Docstring: Fill a single paragraph of text, returning a new string. Reformat the single paragraph in 'text' to fit in lines of no more than 'width' columns, and return a new string containing the entire wrapped paragraph. As with wrap(), tabs are expanded and other whitespace characters converted to space. See TextWrapper class for available keyword args to customize wrapping behaviour.
Use regex if you don’t want to merge a line into another line:
import re
strs = """In my project, I have a bunch of strings that are.
Read in from a file.
Most of them, when printed in the command console, exceed 80.
Characters in length and wrap around, looking ugly."""
print('n'.join(line.strip() for line in re.findall(r'.{1,40}(?:s+|$)', strs)))
# Reading a single line at once:
for x in strs.splitlines():
print 'n'.join(line.strip() for line in re.findall(r'.{1,40}(?:s+|$)', x))
output:
In my project, I have a bunch of strings that are. Read in from a file. Most of them, when printed in the command console, exceed 80. Characters in length and wrap around, looking ugly.
Method 2
This is what the textwrap module is for. Try textwrap.fill(some_string, width=75).
Method 3
This is similar to Ashwini’s answer but does not use re:
lim=75
for s in input_string.split("n"):
if s == "": print
w=0
l = []
for d in s.split():
if w + len(d) + 1 <= lim:
l.append(d)
w += len(d) + 1
else:
print " ".join(l)
l = [d]
w = len(d)
if (len(l)): print " ".join(l)
Output when the input is your question:
In my project, I have a bunch of strings that are read in from a file. Most of them, when printed in the command console, exceed 80 characters in length and wrap around, looking ugly. I want to be able to have Python read the string, then test if it is over 75 characters in length. If it is, then split the string up into multiple strings, then print one after the other on a new line. I also want it to be smart, not cutting off full words. i.e. "The quick brown <newline> fox..." instead of "the quick bro<newline>wn fox...".
Method 4
string, max_width = input(), int(input())
result = wrap(string, max_width)
print(result)
def wrap(string, max_width):
s=''
for i in range(0,len(string),max_width):
s+=string[i:i+max_width]
s+='n'
return s
Method 5
In python-3
import textwrap
def wrap(string, max_width):
return 'n'.join(textwrap.wrap(string,max_width))
Input:
wrap(ABCDEFGHIJKLIMNOQRSTUVWXYZ, 4)
output:
ABCD EFGH IJKL IMNO QRST UVWX YZ
Method 6
string, max_width = input(), int(input())
result = wrap(string, max_width)
print(result)
def wrap(string, max_width):
s=''
for i in range(0,len(string),max_width):
s=s+string[i:i+max_width]
s=s+'n'
return s
Method 7
import textwrap
def wrap(string, max_width):
return textwrap.fill(string,max_width)
if __name__ == '__main__':
string, max_width = input(), int(input())
result = wrap(string, max_width)
print(result)
input:
ABCDEFGHIJKLIMNOQRSTUVWXYZ “n”
4output:
ABCD”n”
EFGH”n”
IJKL”n”
IMNO”n”
QRST”n”
UVWX”n”
YZ”n”
Method 8
Without using any inbuilt function, this will wrap the string into a paragraph of input width. Given you have a long string get the length of the string, use range(0,len(string),max_width) so that it will iterate till it becomes empty. Empty string is assigning new line. One thing to note here is when you return(string[i:i:i+max_width])
def wrap(string, max_width):
empty_string=''
for i in range(0,len(string),max_width):
empty_string+=string[i:i+max_width]
print(string[i:i+max_width])
empty_string+='n'
return (string[i:i:i+max_width])
if __name__ == '__main__':
string, max_width = input(), int(input())
result = wrap(string, max_width)
print(result)
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0