如何使用\ n?
对字符串执行eval为什么这不起作用?
a = eval('"hello \n"')
In [70]: eval("\"hello \n\"")
File "<string>", line 1
"hello
^
SyntaxError: EOL while scanning string literal
虽然这样做
a = "hello \n"
我的用例是通过子进程执行的脚本输出字典作为字符串,我正在捕获它的stdout,我想对它执行eval。
'''[
{ "hello": "the description of this is\' \n"}
]'''
答案 0 :(得分:5)
你需要逃避反斜杠。
%
没有那个转义,Python会看到这个代码(这是一个明显的错误):
>>> 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
>>>
而不是所需的代码:
"hello
"
答案 1 :(得分:2)
如果要指定其中包含文字\
和n
的字符串,则需要加倍反斜杠,或使用原始字符串文字:
>>> '"hello\\n"'
'"hello\\n"'
>>> r'"hello\n"'
'"hello\\n"'
然后可以将这样的字符串计算为包含字符串文字的Python表达式:
>>> eval(r'"hello\n"')
'hello\n'
如果您的输出是由输出pprint.pprint()
的值的子进程生成的,那么您所做的不仅仅是读取该流,因为它会生成完全有效的Python语法。例如,不要将该输出复制并粘贴到Python解释器中,因为它只是直接解释转义序列(因此在将它传递给eval()
之前)。如果您正在使用解释器进行开发,则可以使用pprint.pformat()
来生成带有输出的变量,而不是写入stdout。
如果您尝试使用Python repr()
或pprint.pprint()
输出在系统之间传递数据,请立即停止。请使用正确的序列化格式,例如JSON。如果这不是一个选项,至少使用ast.literal_eval()
来限制代码接受仅 Python文字的内容,而不是任意代码(例如'__import__("os").system("rm -rf /")
)。