我正在运行一个名为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]
发生问题。
答案 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__()
之间差异的更多信息: