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



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

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

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

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

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]

出现问题。

我还没有被允许发表评论,但是,也许这个答案仍然对你有帮助。

您可以通过直接访问该字符来检查字符串中特定位置的字符(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__函数),第二个版本生成格式良好的字符串表示形式(使用对象的__str__函数)。

当您调用print(somelist)时发生的事情是,python 以somelist格式打印每个对象的repr值,这可以让您使用eval函数从打印的列表字符串重新创建列表。

查看以下链接,了解有关__repr__()__str()__之间区别的更多信息:

  • 了解 Python 中的 repr( ) 函数
  • https://docs.python.org/2/library/functions.html#repr

最新更新