Передача переменной в команду subproccess.call sed в python - PullRequest
0 голосов
/ 25 апреля 2019

Проблема

Я хотел бы передать свою переменную 'value' из моего словаря (созданного из простого CSV-файла) в вызов sed для подпроцесса в python, проблема в том, что я получаю ошибку:

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 выражение # 1, символ 30: неопределенная команда `s '

Пример ввода

Словарь 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*

1 Ответ

0 голосов
/ 26 апреля 2019

Проблема заключалась в том, что из файла 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(',')

Остановил символы новой строки, сохраняемые в ditionary, и это позволяет использовать их в команде subprocess.call sed.

...