Python程序将字典视为字符串

-2 投票
3 回答
867 浏览
提问于 2025-04-17 03:04

我设置了一个字典,并从一个文件中填充了它,像这样:

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()

然后我对它进行了测试,像这样:

if not filedusers.get(words[0]):

这里的 words[0] 是一个用户名的字符串,但我遇到了以下错误:

'str' object has no attribute 'get'

不过我已经确认在 FILE.close() 之后,我确实有一个字典,并且里面的值都是正确的。

你知道发生了什么吗?

3 个回答

1

Python是一种动态类型的编程语言,这意味着你不需要在定义变量时指定它的类型。你可以很随意地定义变量。比如,你最开始把filedusers定义成一个字典,然后又通过给它赋值ast.literal_eval的结果,把它重新定义成了一个字符串。

补充说明:你需要去掉那些引号。ast.literal_eval('"{}"')的结果是一个字符串,而ast.literal_eval('{}')的结果是一个字典。

3
>>> import ast
>>> username = "asd: '123'"
>>> filedusers = ast.literal_eval("\"{" + username + "}\"")
>>> print filedusers, type(filedusers)
{asd} <type 'str'>

你并没有一个字典,它看起来像一个。你其实只有一个字符串。

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 会把你的字符串当成一个真正的字符串来看,因为有引号的原因。

撰写回答