【问题标题】:String format python字符串格式python
【发布时间】:2016-05-26 09:46:01
【问题描述】:

我正在尝试清理一个糟糕的解决方案。我有一个 utils 文件,其中包含一些通用方法和一个命令文件,其中存储了要在程序中使用的命令列表。但是,当尝试使用字符串格式清理文件时,我开始遇到问题。

# utils.py
import os

bin = '/usr/bin'
tool = '{0}/tool'.format(bin)
command = '{0} -dir %s -o geniso'.format(tool)

def exec_cmd(cmd):
    os.system(cmd)

# dowork.py
from utils import *
exec_cmd(command % '/var/tmp')

在您可以看到的示例中,我试图通过连接变量来清理命令/实用程序,以减少变量中的字符数量,并且效果很好。问题是,当我尝试使用另一个变量(例如目录名称(从不同的类传递))扩展该格式时,我对如何有效地进行这种格式化感到困惑。我也遇到了以下异常:

Traceback (most recent call last):
  File "some_script.py", line 12, in <module>
    import commands as cmd
  File "/var/tmp/commands.py", line 32, in <module>
    SOME_CMD = '{0} -p %s | tail -n +4 | awk \'{print \$4}\''.format(SOMETOOL)
KeyError: 'print \\$4'

我怎样才能清理这个绝对的混乱,以便我可以很好地格式化我的命令文件,但在脚本中使用命令时还留有进一步扩展的空间。

【问题讨论】:

    标签: python linux bash coding-style


    【解决方案1】:

    如果你想在格式化字符串中使用大括号,你必须将它们转义,例如在您的示例中使用

    SOME_CMD = '{0} -p %s | tail -n +4 | awk \'{{print \$4}}\''.format(SOMETOOL)
    

    -- 注意print \$4 周围的双括号。

    在相关说明中,连接系统调用的字符串被认为是一种非常糟糕的做法。如果您不需要 shell 扩展和功能,您可以使用subprocess API,它允许您将参数作为列表而不是字符串传递。还有一个相当不错的 sh(http://amoffat.github.io/sh/) 包,它支持管道、shell 扩展等。

    【讨论】:

      【解决方案2】:

      如果你有一个复杂的行有多个替换,你可以这样做:

      # replacements
      reps = {
          'foo': 'aaa',
          'bar': 'bbb',
          'baz': 'ccc'
      }
      
      # string to format
      s = '...{foo}...{bar}...{baz}...'
      
      # format it
      s2 = s.format(**reps)
      
      # gives: '...aaa...bbb...ccc...'
      

      【讨论】:

        猜你喜欢
        • 2021-08-06
        • 1970-01-01
        • 2019-11-28
        • 2011-07-28
        • 2020-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多