如何在python 3.6中将变量定义为字典

如何在python 3.6中将变量定义为字典,python,python-3.x,Python,Python 3.x,我正在尝试制作一个程序,它将文本文件的内容作为字典使用 当我输入这个代码时 A=open("dic.txt","r") print(A.read()) if "A" in A: print("spam") else: print("eggs") 我得到这个输出: {"A":1} eggs 我想要的是: {"A":1} spam 有什么办法吗?我不明白为什么它不起作用 以下是文本文件的内容: {"A":1} 工作版本可以是: from ast import literal

我正在尝试制作一个程序,它将文本文件的内容作为字典使用

当我输入这个代码时

A=open("dic.txt","r")
print(A.read())

if "A" in A:
    print("spam")
else:
    print("eggs")
我得到这个输出:

{"A":1}
eggs
我想要的是:

{"A":1}
spam
有什么办法吗?我不明白为什么它不起作用

以下是文本文件的内容:

{"A":1}

工作版本可以是:

from ast import literal_eval

A=open("dic.txt","r")

data = A.read()
print(data)

dictionary = literal_eval(data)
if "a" in dictionary or "A" in dictionary:
    print("spam")
else:
    print("eggs")

您当前的代码有一些问题:

  • 您永远不会存储文件的内容
  • 你从来没有真正做过字典
  • file对象的
    read()
    方法返回字符串,而不是字典
  • 你从未关闭过这个文件
  • 要解决这个问题,可以使用Python内置的
    eval
    来解析字符串中的字典,但这可能是危险和不可靠的

    此外,您还可以通过稍微“分散”代码来解决类似的未来问题,这意味着,通过使用清晰的变量名和良好的间距,使代码更易于阅读,从而使调试更容易进行:

    file       = open("dic.txt", "r")
    contents   = file.read()
    dictionary = eval(contents) # VERY dangerous
    
    if "key" in A:
        print("key is in dictionary! :)")
    else:
        print("key is not in dictionary! :(")
    
    file.close()
    
    希望这有帮助


    EDIT:像这个帖子上的其他海报一样,我也认为
    eval
    应该很少使用,但在我看来,它似乎是解决这个特定问题的最简单的方法。我不建议对像这样的问题使用
    eval
    ,除非您确切知道自己在做什么。使用
    literal\u eval
    的其他解决方案可能比这个更好(它们甚至在我之前发布过);我只是描绘了一个可能很有趣的不同解决方案。向任何被误导的人和任何被冒犯的pythoner道歉。

    请共享文本文件及其外观。您可以使用
    eval()
    进行此操作,但如果文本文件来自未知来源,则使用此文件是危险的。您需要将文件内容保存到变量中<代码>打印(A.read())不会这样做。改用
    A=open(“dic.txt”,“r”).read()
    。另外,在使用
    open()
    时,请确保在程序末尾使用
    A.close()
    ,以获得良好的实践效果。我理解它区分大小写,但我在修复它后尝试过,但仍然不起作用。我将尝试Xay的建议。这不是你问题的解决方案,因为从文件中读取字典时,它仍然是一个字符串。尝试以下几种解决方案:)几乎任何事情都不应该使用
    eval
    。大量的反对票。看看用户3738870提出的替代解决方案。它确实有用!谢谢这不是我最好的作品,所以我很高兴这只是一个测试文件。再次感谢@DYZ感谢您的反馈,编辑了我的答案,希望这是更好的。如果仍然是“大否决票”,请让我知道,我将删除或进一步编辑我的答案:)@AvivShai,供您编辑:没有人被冒犯,IMHO,但是“特殊情况不足以打破规则”。请参阅或-或者-编写
    将此导入Python交互控制台。稍微好一点:
    用于“aA”中的char:如果字典中有字符:打印(“垃圾邮件”)中断;其他:打印(“鸡蛋”)
    -<代码>对于
    和其他没有缩进,
    如果
    缩进,第一个
    打印
    中断
    缩进两次,第二个
    打印
    缩进一次。-是的,
    for
    循环有一个
    else
    分支,只有在中断未执行时才执行该分支。