python .format没有按预期工作

时间:2018-06-01 18:38:58

标签: python format

这对我没有意义。我定义了5个变量:

a='a'
b='b'
c='c'
d='d'
e='e'

然后我尝试使用这些变量构建命令:

command = "for i in \`python {0}_getSyslogs.py {1} {2} {3}\`\ndo\ngunzip -c {3}/\$i | egrep -i '{4}' >> " .format(a,b,c,d,e)

这可以按预期工作,生成命令:

"for i in \\`python a_getSyslogs.py b c d\\`\ndo\ngunzip -c d/\\$i | egrep -i 'e' >> "

如果我在字符串中添加一个组件(即“test”),我得到的是什么,整个事情就会分崩离析,因为没有更多的替换:

command = "for i in \`python {0}_getSyslogs.py {1} {2} {3}\`\ndo\ngunzip -c {3}/\$i | egrep -i '{4}' >> " + "test" .format(a,b,c,d,e)

结果命令如下:

"for i in \\`python {0}_getSyslogs.py {1} {2} {3}\\`\ndo\ngunzip -c {3}/\\$i | egrep -i '{4}' >> test"

这可能是一个“看不见穿过树林的森林”的问题,但我一直在尝试各种不同的组合,没有任何作品。

我在CentOS上运行python 2.7.10:

  
    
      

内容sys.version       '2.7.10(默认,2017年10月6日,22:29:07)\ n [GCC 4.2.1兼容的Apple LLVM 9.0.0(clang-900.0.31)]'

    
  

我做错了什么?

4 个答案:

答案 0 :(得分:2)

您只在“test”字符串上应用format函数。

尝试:

command = "for i in \`python {0}_getSyslogs.py {1} {2} {3}\`\ndo\ngunzip -c {3}/\$i | egrep -i '{4}' >> test" .format(a,b,c,d,e)

答案 1 :(得分:1)

试试这个:(command+"test").format(a,b,c,d,e),即将其放在括号中。您当前的方法仅使用"test"

上的格式

答案 2 :(得分:0)

为什么不呢,

"... >> test".format(a,b,c,d,e)

而不是

"... >> " + "test".format(a,b,c,d,e)

.format仅适用于一个string对象,您将其应用于"test"

如果确实想要连接两个字符串,首先将它们存储在变量中,然后执行您需要执行的操作。

str1 = "example{} " + "test"
str1.format('3')
# example3 test

答案 3 :(得分:0)

如果可能,请不要尝试填写字符串模板来构建命令,因为您不太可能正确引用引号。相反,尽可能使用subprocess模块在​​Python中执行此操作。

from subprocess import Popen, call, PIPE

def processFile(name, pattern, output):
    p = Popen(["gunzip", "-c", name], stdout=PIPE)
    call(["egrep", "-i", pattern], stdin=p1.stdout, stdout=output)

with open("test", "w") as fh:
    p = Popen(["python", "{0}_getSyslogs.py".format(a), b, c, d], stdout=PIPE)
    for x in p.stdout:
        x = x.strip()
        processFile(os.path.join(d, x), e, fh)