2

Lisp type languages usually provide an abstraction which allows you to open a string as a file, and then print to it using any function which can normally print to a file. When you close the string you can recuperate the string that was printed.

Does something like this exist for python?

It probably would like something like this:

f = open_string_as_output()
f.write("hello")
if some_condition:
   f.write(" ")
g(f) # allow g to write to the sting if desired
f.close()
str = f.get_string()

3 Answers 3

5

There is a class called StringIO, which does what you described.

import io
string_out = io.StringIO()
string_out.write('Foo')
if some_condition:
    string_out.write('Bar')
string_out.getvalue()  # Could be 'Foo' or 'FooBar'
Sign up to request clarification or add additional context in comments.

1 Comment

Nice trick, but it looks like you've lost the versatility of the print function (multiple positional arguments, named arguments, ...)
3

the io module allows exactly that: use the versatility of the print() function with the flux redirected to a string.

from io import StringIO
output = StringIO()
print("Hello World!", file=output)
print(f"I have written so far this to my string: {output.getvalue()}", file=output)

result = output.getvalue()
print(result)

outputs:

Hello World!
I have written so far this to my string: Hello World!

You cannot overuse this technique. See this example:

from io import StringIO
garbage = StringIO()

def foo(stuff, out_flux=None):
    ''' A function that prints stuff but you need to mute from time to time. '''
    result = stuff
    print(result, file=out_flux)

# normal use
foo(10) # prints 10

# muted use
foo(10, out_flux=garbage) # prints nothing
print(garbage.getvalue()) # prints whatever was collected so far

Comments

1

There is somthing called a string stream which might help you.

import io # the library for input and output 
       
words = ["PEPPERS", "SWEET", "BELL", "AMPIUS", "PKT" "$2.00"] 

str_strm = io.StringIO()
   
# `sep` is `separator`    
# `end` is `end of line`

print(*iter(words), sep="...", end="\r\n", file=str_strm)

final_result = str_strm.getvalue()

str_strm.close() # a close the string stream to avoid a memory leak 

However, there are simpler ways to print to a string.

def print2str(*args, sep=' ', end='\n') -> str:
    it = iter(str(arg) for arg in args) 
    result = sep.join(it) + end
    return result 

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.