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'}