【问题标题】:for k, v in dict ///// TypeError: 'str' object is not callablefor k, v in dict ///// TypeError: 'str' object is not callable
【发布时间】:2014-10-19 07:00:30
【问题描述】:
import getpass

class LogInNow(object):

    def __init__(self, file):
        self.openfile = open(file, 'r')
        self.readfile = self.openfile.read()

    def authenticate(self):
        self.username = raw_input("Enter Username> ")
        self.password = getpass.getpass("Enter Password> ")
        for k, v in self.readfile():  <---------------------------------
            if k == self.username and v == self.password:
                print "It worked"
            else:
                print "Fail"""

go = LogInNow("password.txt")
go.authenticate()

这是一个粗略的“登录”模块,它遍历位于 password.txt 上的字典,目前仅显示基于匹配成功的消息。

错误显示在标题中,错误的行是带箭头的那一行。

我尝试删除括号以及我不记得的所有其他内容

有什么想法吗?

【问题讨论】:

  • 对于初学者,该行缩进不正确
  • 如果您的文件包含字典,它可能足够接近以作为 JSON 传递。所以使用json 模块。
  • @shaktimaan 那是抄错了

标签: python string dictionary iteration keyvaluepair


【解决方案1】:

除了其他问题(见下文)之外,您将self.readfile 设置为字符串,而不是函数。您不小心调用 self.openfile.read() 而不是获取函数本身。你想要的:

self.readfile = self.openfile.read  # <-- No parentheses at the end!

您还遇到了许多其他问题。例如,read 方法的返回值是一个字符串,而不是一个映射或任何您期望的序列,所以 for k, v in self.readfile() 将不起作用。您需要首先将字符串解析为字典、元组序列或您期望的任何内容——当然,您如何做到这一点取决于您的要求和文件的内容。附带说明一下,如果您确实需要字典(例如,mydict),您应该首先取出循环并检查是否有 mydict.get(self.username) == self.password

您的循环行(您标记为错误的行)也缩进太少,但我怀疑这是复制/粘贴错误。

【讨论】:

  • 我认为这也行不通。他正在尝试read() 的返回值,就像它是一个字典一样。
  • 这远不是唯一的问题。
  • 是的,是的,我正在编辑一些 cmets 的其他问题。
  • @HenryKeiter 我确实想要一个字典。在这种情况下访问 dict 的语法是什么?它可以是 .txt 格式还是必须是 .py?
  • @z82n 我猜您可以将其加载为 json,但我的猜测是逐行解析文件并从中制作字典会更快。如果你不知道怎么做,就在 SO 上搜索,有很多将文件读入 dict 的例子。
【解决方案2】:

当您定义readfile 时,您已经调用了read 函数,因此readfile 被设置为该函数的返回值——即包含文件内容的字符串。你不能调用那个字符串。将循环更改为 for k, v in self.readfile 或将之前的行更改为 self.readfile = self.openfile.read

但是,您的代码仍然无法工作,因为您正试图迭代整个文件,就好像它是一系列键值对一样。但事实并非如此;它只是一个大字符串。如果你想把它解析成键值对,你需要自己做。

【讨论】:

  • 好的,现在如何将文件调整为键值对序列?是不是类型(.txt)错了?
  • @z82n:不。您需要获取文件的原始文本并对其进行解析。如何做到这一点取决于文件中的内容。您还可以考虑使用像 JSON 这样的标准化格式。不管怎样,这确实是一个单独的问题。
猜你喜欢
  • 1970-01-01
  • 2020-08-09
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多