【问题标题】:Passing a variable into a subproccess.call sed command in python将变量传递给 python 中的 subproccess.call sed 命令
【发布时间】:2019-09-15 03:10:44
【问题描述】:

问题

我想将我的字典中的“值”变量(从简单的 csv 文件创建)传递到 python 中的子进程 sed 调用中,问题是我收到错误:

sed:-e 表达式#1,字符 1:未知命令:`''

当我运行以下脚本时:

import sys
import subprocess

speciesdictfile = open("speciesfiletest.csv",'r')

file = sys.argv[1]

dict = {}

for line in speciesdictfile:
    fields = line.split(',')
    dict[fields[0]] = fields[1]


for line in file:
    for key, value in dict.items():
        if file == key:
            subprocess.call(["sed", "'s/>/>" + value + "_/g'", file])

当我尝试这个时:

subprocess.call(['sed', 's/>/>' + value + '_/g', file])

我收到以下错误:

sed: -e expression #1, char 30: unterminated `s' command

输入示例

字典 CSV 文件:

file,Species
GCF_000006175.1_ASM617v2_genomic.faa,Methanococcus voltae
GCF_000006805.1_ASM680v1_genomic.faa,Halobacterium sp.

我要搜索和替换的文件,例如文件名 GCF_000006175.1_ASM617v2_genomic.faa:

>NZ_LT985082.1_1_1
EQVWKSIKKYMAYYLFDTIEFMEKLFEKEFYRIVNRDSYYKNWISKFIMIN*
>NZ_LT985082.1_2_1
MKFNISKLWNPTGFFISFFMSFLMPIMFAVPFGYIPIDIFLYQQLIRWPVAYFIVTLIVI
PISLYLAKSFFTFPPTDRFFNPVTFFISLQMSFIMPFLLGYGFGSMSLNILFLMWPMRWV
VAYFMVNFAIRPLSISLARIVFNVEPQHLIIKF*

期望的输出

一个有效的 sed 命令,用 '>' 替换行的每个实例,用 '>' 后跟不带空格的值变量,例如:

>Methanococcus_voltae_NZ_LT985082.1_1_1
EQVWKSIKKYMAYYLFDTIEFMEKLFEKEFYRIVNRDSYYKNWISKFIMIN*
>Methanococcus_voltae_NZ_LT985082.1_2_1
MKFNISKLWNPTGFFISFFMSFLMPIMFAVPFGYIPIDIFLYQQLIRWPVAYFIVTLIVI
PISLYLAKSFFTFPPTDRFFNPVTFFISLQMSFIMPFLLGYGFGSMSLNILFLMWPMRWV
VAYFMVNFAIRPLSISLARIVFNVEPQHLIIKF*

【问题讨论】:

  • 在 subprocess.call() 上尝试 shell=True

标签: python sed subprocess


【解决方案1】:

问题是从 csv 文件中提取了换行符。我解决了它:

import sys
import subprocess

speciesdictfile = open("speciesfiletest.csv",'r')

file = sys.argv[1]

dict = {}

for line in speciesdictfile:
    fields = line.rstrip().split(',')
    dict[fields[0]] = fields[1]


for line in file:
    for key, value in dict.items():
        if file == key:
            subprocess.call("sed -e 's/>/>" + value + "_/g' " + file, shell=True)

线

fields = line.rstrip().split(',')

停止存储在字典中的换行符,这允许它们在 subprocess.call sed 命令中使用。

【讨论】:

    猜你喜欢
    • 2019-02-16
    • 2017-12-15
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    相关资源
    最近更新 更多