【问题标题】:python TypeError not enough arguments for format stringpython TypeError没有足够的格式字符串参数
【发布时间】:2012-07-09 00:00:20
【问题描述】:

尝试使用 python 结构更新文件

run('sed -i s/jahil/%s/g /etc/nginx/sites-enabled/%s' % (account))

run('sed -i "s/jahil/%s/g" /etc/nginx/sites-enabled/%s' % (account))

错误:

TypeError: not enough arguments for format string

有什么想法吗?非常感谢!

【问题讨论】:

  • 请注意,% 已过时。如果可以,请将代码更新为字符串对象的.format() 方法。
  • @SimeonVisser 实际上,当 v3 发布时,虽然有人谈论要摆脱 %-formatting,但我后来了解到,%-formatting 暂时会继续存在。
  • @Levon:在 PEP 中提到过吗?我知道他们在 Unicode 文字前面重新引入了“u”,以使移植更容易。
  • @SimeonVisser 查看此答案底部的注释stackoverflow.com/a/11099798/1209279,它与 Python 3.2 发行说明有关。在那之前,我还认为%-formatting 在不久的将来会被淘汰
  • @Levon:谢谢,我不知道,我以为它很快就会被删除。简短的结论是% 不会很快被删除,但建议将.format() 用于新代码(基于docs.python.org/py3k/library/…

标签: python regex sed fabric


【解决方案1】:

错误告诉您问题所在:您的字符串中有两个%s 占位符,但只有一个值。我假设您想在两个地方使用相同的值。在这种情况下:

run('sed -i s/jahil/%s/g /etc/nginx/sites-enabled/%s' % (account, account))

或者,等效地,使用字典,以便我们可以使用命名占位符:

run('sed -i s/jahil/%(a)s/g /etc/nginx/sites-enabled/%(a)s' % {"a": account})

完全在 Python 中进行这种字符串替换很容易;您可能会考虑这样做而不是炮轰。

【讨论】:

    【解决方案2】:

    正如错误所说,您所说的参数数量与您提供的数量不匹配。一个自然错误,因为您希望它们相同:

    run('sed -i "s/jahil/%s/g" /etc/nginx/sites-enabled/%s' % (account, account))
    

    【讨论】:

      【解决方案3】:

      您的格式字符串中有 两个 %s,因此您正在构建的字符串期望获得 两个 string 参数。

      除非accounts 是两个字符串的元组,否则您将收到此消息。

      你应该有这样的东西:

         % (account, something_else)
      

      如果这两个字符串都需要为account,那么% (account, account) 就可以了。

      【讨论】:

        猜你喜欢
        • 2016-04-16
        • 2014-04-07
        • 1970-01-01
        • 2012-06-24
        • 2018-06-07
        • 2019-10-26
        • 1970-01-01
        • 2020-03-10
        相关资源
        最近更新 更多