Python &引用;SyntaxError:无效语法“;使用eval时

Python &引用;SyntaxError:无效语法“;使用eval时,python,dictionary,Python,Dictionary,我有一个非常奇怪的语法错误。在第一次代码运行良好,但之后 它不起作用 MailName={} string = "" #pdb.set_trace() fp=open("C:\\Users\\Dvir\\Dropbox\\chat\\cred.txt","a+") #pdb.set_trace() try: string=fp.read() except: string="" if (string !=""): MailName = eval(string) 问题

我有一个非常奇怪的语法错误。在第一次代码运行良好,但之后 它不起作用

MailName={}
string = ""
#pdb.set_trace()
fp=open("C:\\Users\\Dvir\\Dropbox\\chat\\cred.txt","a+")
#pdb.set_trace()

try:
    string=fp.read()

except:
    string=""

if (string !=""):
    MailName = eval(string)
问题代码是:

MailName = eval(string)
语法错误:


当我第一次使用这部分代码时,它工作得很好,但之后它显示了语法错误,这很奇怪,因为它是一个有效的字典。

我会将数据存储在JSON中,然后使用加载-这比使用
eval()更安全。


引自:

eval()将允许恶意数据危害整个系统, 杀了你的猫,吃了你的狗,和你的妻子做爱

最近有一条关于如何安全地做这类事情的线索 在python开发列表中,结论如下:

It's really hard to do this properly.
It requires patches to the python interpreter to block many classes of attacks.
Don't do it unless you really want to.

您可以按如下方式格式化文本文件:(cred.txt)

然后像这样加载它:

>>> with open('cred.txt', 'rb') as f:
>>>     data = json.load(f)
>>>     print data
{'familyname': 'josh', 'pass': 'UGGlXJCpl', 'email': 'chat@gmail.com', 'name': 'justin'}

你的文件是多行的吗?如果每一行看起来像{…}而没有结尾逗号,则可能会出现无效语法,因为您的MailName可能看起来像{…}{…},而这不是有效的字典。除此之外,请提供更多信息,为什么首先要使用
eval
?如果您必须评估任意Python文本,至少使用
ast.literal\u eval
,这可以防止代码注入攻击(如果有人编辑
cred.txt
来表示
os.system(“deltree/Y C:\”)
与您的代码一起使用,会发生什么情况),并且有时会提供更好的错误消息来引导。但通常,评估Python文本是一个坏主意。如果要存储数据,请使用JSON或YAML等人类可读的交换格式,或者使用pickle等紧凑灵活的格式,而不是
repr
eval
。此外,当您要在读取之前覆盖它们时,为什么要在顶部设置
MailName={}
string=”“
?这不是C,在C中,必须在顶部声明所有变量;在Python中,唯一的效果通常是隐藏由拼写错误引起的bug。最后,你说的“第一次”是什么意思?第一次运行程序时,它工作,第二次不工作?还是程序中有循环?循环是否只是重新评估相同的字符串,或者从相同的文件对象读取,或者打开文件并再次读取,或者是什么?(PS,
string
是标准库模块的名称,因此不应将其用作变量的名称;这会导致混淆。)为什么选择向下投票?
eval()。但如果你能解释为什么这样做更安全,而不是直截了当地说出来,这将是一个更好的答案。(首先告诉OP如何将数据存储在JSON中可能会有帮助,因为他的现有数据看起来是JSON-y,但它不是有效的JSON。)此外,它并没有真正直接回答OP的问题。对你或我来说,你这样回答是显而易见的,但我可以想象OP或其他新手可能会否决你,因为对他来说,这似乎完全不相关……@user1341970:除了我上面已经说过的以外,很难在评论中描述:
eval('os.system(“deltree/Y C:/”))
将删除你硬盘上的所有内容
ast.literal\u eval('os.system(“deltree/Y C:/”)将引发一个
ValueError
。其思想是
literal\u eval`只适用于文本数字、字符串、
list
s等,而
eval
适用于任何Python表达式。@abarner别担心,我不关心代表,只是不想看到
eval()
在野外使用!
It's really hard to do this properly.
It requires patches to the python interpreter to block many classes of attacks.
Don't do it unless you really want to.
{
    "familyname": "josh", 
    "email": "chat@gmail.com", 
    "name": "justin", 
    "pass": "UGGlXJCpl"
}
>>> with open('cred.txt', 'rb') as f:
>>>     data = json.load(f)
>>>     print data
{'familyname': 'josh', 'pass': 'UGGlXJCpl', 'email': 'chat@gmail.com', 'name': 'justin'}