我设置了一个字典,并从文件填充,如下:
filedusers = {} # cheap way to keep track of users, not for production
FILE = open(r"G:\School\CS442\users.txt", "r")
filedusers = ast.literal_eval("\"{" + FILE.readline().strip() + "}\"")
FILE.close()
然后我对它进行了测试,如下:
如果不是filedusers.get(words [0]):
其中words[0]
是用户名的字符串,但我收到以下错误:
'str'对象没有属性'get'
但我已经验证了FILE.close()
后我有一本字典,并且其中包含正确的值。
知道发生了什么事吗?
答案 0 :(得分:5)
literal_eval接受一个字符串,并将其转换为python对象。所以,以下是真的......
ast.literal_eval('{"a" : 1}')
>> {'a' : 1}
但是,您正在添加一些不需要的引用。如果您的文件只包含一个空字典({}
),那么您创建的字符串将如下所示......
ast.literal_eval('"{}"') # The quotes that are here make it return the string "{}"
>> '{}'
因此,解决方案是将线路更改为......
ast.literal_eval("{" + FILE.readline().strip() + "}")
...或...
ast.literal_eval(FILE.readline().strip())
..取决于您的文件布局。否则,literal_eval会因为引号而将您的字符串视为ACTUAL字符串。
答案 1 :(得分:3)
>>> import ast
>>> username = "asd: '123'"
>>> filedusers = ast.literal_eval("\"{" + username + "}\"")
>>> print filedusers, type(filedusers)
{asd} <type 'str'>
你没有字典,它只是一个字典。你有一个字符串。
答案 2 :(得分:1)
Python是动态类型的:它不要求您将变量定义为特定类型。它允许您隐式定义变量。您正在做的是将filedusers
定义为字典,然后通过将ast.literal_eval
的结果分配给字符串,将重新定义作为字符串。
编辑:您需要删除这些引号。 ast.literal_eval('"{}"')
计算为字符串。 ast.literal_eval('{}')
评估字典。