Reputation: 3908
How can I perform a eval on a string with \n ?
Why does this not work?
a = eval('"hello \n"')
In [70]: eval("\"hello \n\"")
File "<string>", line 1
"hello
^
SyntaxError: EOL while scanning string literal
Whereas this does
a = "hello \n"
My use case is that a script executed through subprocess is outputing a dictionary as a string of which I am capturing the stdout of it and I would like to perform an eval on it.
'''[
{ "hello": "the description of this is\' \n"}
]'''
Upvotes: 4
Views: 6384
Reputation: 1121366
If you want to specify a string that has a literal \
and n
in it you either need to double the backslash, or use a raw string literal:
>>> '"hello\\n"'
'"hello\\n"'
>>> r'"hello\n"'
'"hello\\n"'
Such a string can then be evaluated as a Python expression containing a string literal:
>>> eval(r'"hello\n"')
'hello\n'
If your output is produced by a child process outputting the value with pprint.pprint()
, you are doing more than just read that stream, as that produces perfectly valid Python syntax. Don't copy and paste that output into a Python interpreter, for example, because that'll just interpret the escape sequences directly (so before you pass it to eval()
). If you are developing in an interpreter, you could use pprint.pformat()
to produce a variable with the output, rather than write to stdout.
If you are trying to use Python repr()
or pprint.pprint()
output to pass data between systems, however, stop right there. Use a proper serialisation format instead, such as JSON. If that's not an option, at the very least use ast.literal_eval()
to limit what your code accepts to only Python literals, and not arbitrary code (such as '__import__("os").system("rm -rf /")
).
Upvotes: 3
Reputation: 49320
You need to escape the backslash.
>>> eval('"hello \n"')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
"hello
^
SyntaxError: EOL while scanning string literal
>>> eval('"hello \\n"')
'hello \n'
>>> print(eval('"hello \\n"'))
hello
>>>
Without that escape, Python will see this code (which is an obvious error):
"hello
"
Rather than the desired code:
"hello \n"
Upvotes: 6