Python:末尾带有\ n的eval字符串

时间:2016-01-08 14:43:16

标签: python python-2.7

如何使用\ 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"}
]'''

2 个答案:

答案 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 /"))。