将多个字符串附加在一起并打印它们会引发' /'存在双引号的字符

时间:2017-06-13 14:55:28

标签: string python-3.x subprocess

我正在运行一个名为snpSift的Java工具,并希望在多个文件上运行它。因此我使用pythong脚本并使用子进程。我试图创建一个字符串的实际命令是:

java -jar SnpSift.jar filter "ANN[0].EFFECT has 'variant'" input.vcf > ~/output.vcf

这个命令是正确的,因为我自己直接在命令行上使用它。我创建了一个名为variantType的列表,其中包含我打算在运行snpSift时用作变量的不同变体的字符串。

我正在尝试创建另一个列表(命令),它将整个命令行输入包含为每个文件和每个variantType的字符串。我的脚本如下:

command = [] 
for file in os.listdir("filepath"):  
    absfile = os.path.abspath(file)  
    if(file.endswith(".vcf")):
        for i in variantType:  
            w = 'java -jar SnpSift.jar filter "'
            x = "ANN[0].EFFECT has "  
            y = "'" + i + "'"
            z = '" ' + absfile +  " > output." + i + "." + str(file)
            command.append(w+x+y+z)

我的问题是过滤器的输入必须有这样的引号:"ANN[0].EFFECT has 'variant'"

我尝试使用双引号执行此操作失败,并导致以下输出:

'java -jar SnpSift.jar filter "ANN[0].EFFECT has \'transcript_ablation\'" input.vcf > ~output.vcf'

如何删除这些' \'字符?如果我打印y(包含整个字符串的那部分的变量)这些字符没有打印,但是当我打印整个命令时,它们就在那里,因此我无法正确运行命令。

修改

当我使用时:

print(command[0])

这将打印所需的命令(没有' \')。

只有在我使用时才会:

command[0]

发生问题。

1 个答案:

答案 0 :(得分:0)

我还不能发表评论,但是,这个答案可能对你有帮助。

您可以直接访问该字符(somestr[position]),检查字符串中特定位置的字符。我运行了你的代码示例(略微修改,例如使用格式来创建命令)并测试了位置48处的哪个字符,结果证明它确实是带有ASCII码39的单引号:

import os

variantType = ['variant', 'test']

command = []

absfile = "/tmp.vcf"
file = "tmp.vcp"

for i in variantType:
    w = 'java -jar SnpSift.jar filter "ANN[0].EFFECT has \'{v}\'" input.vcf > ~/output.vcf'.format(v=i)

    command.append(w)

print(", ".join([str(x) for x in command]))

for x in command:
    print(repr(x))
    print(str(x))
    print(ord(x[48]))

输出如下:

['java -jar SnpSift.jar filter "ANN[0].EFFECT has \'variant\'" input.vcf > ~/output.vcf', 'java -jar SnpSift.jar filter "ANN[0].EFFECT has \'test\'" input.vcf > ~/output.vcf']
java -jar SnpSift.jar filter "ANN[0].EFFECT has 'variant'" input.vcf > ~/output.vcf, java -jar SnpSift.jar filter "ANN[0].EFFECT has 'test'" input.vcf > ~/output.vcf
'java -jar SnpSift.jar filter "ANN[0].EFFECT has \'variant\'" input.vcf > ~/output.vcf'
java -jar SnpSift.jar filter "ANN[0].EFFECT has 'variant'" input.vcf > ~/output.vcf
'
39
'java -jar SnpSift.jar filter "ANN[0].EFFECT has \'test\'" input.vcf > ~/output.vcf'
java -jar SnpSift.jar filter "ANN[0].EFFECT has 'test'" input.vcf > ~/output.vcf
'
39

正如您所看到的,对于每个命令,第一个print语句创建“格式错误”的字符串表示(使用对象的__repr__函数),第二个版本生成格式良好的字符串(使用对象的{{ 1}}功能)。

调用__str__时发生的事情是python打印print(somelist)中每个对象的repr值,这可以让您使用打印的列表字符串重新创建列表somelist功能。

检查以下链接,了解有关eval__repr__()之间差异的更多信息: