字符串格式 python

String format python

我正在尝试清理一个错误的解决方案。我有一个 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')

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

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 \'

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

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

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 扩展等

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

# 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...'