我正在编写一个bash脚本,它使用命令行输入中的参数传递给python脚本,结果是使用python的csv.writer模块生成.csv文件。然后我写了一个R脚本,它自己接受一个.csv文件,但我现在想把csv文件从我的python脚本直接传送到我的r脚本。
这是我的bash脚本:
#!/bin/bash
python protparams.py $1 | Rscript frequency.r
和我的python脚本:
from Bio import SeqIO
from Bio.SeqUtils import ProtParam
from Bio.SeqUtils import ProtParamData
import sys
import csv
handle = open(sys.argv[1])
with open('test.csv', 'w') as fp:
writer = csv.writer(fp, delimiter=',')
for record in SeqIO.parse(handle, "fasta"):
seq = str(record.seq)
X = ProtParam.ProteinAnalysis(seq)
data = [seq,X.get_amino_acids_percent(),X.aromaticity(),X.gravy(),X.isoelectric_point(),X.secondary_structure_fraction(),X.molecular_weight(),X.instability_index()]
writer.writerow(data)
这一切都可以正常工作我的python脚本在通过我的bash脚本调用时会生成csv文件。大!但是当我将它传输到我的bash文件中的以下R脚本时,我收到此错误:
Error in file(file, "rt") : cannot open the connection
Calls: read.csv -> read.table -> file
In addition: Warning message:
In file(file, "rt") : cannot open file 'NA': No such file or directory
Execution halted
这是我的R脚本供参考:
args <- commandArgs(trailingOnly = TRUE)
dat <- read.csv(args[1], header=TRUE)
write.csv(dat, file = "out2.csv")
(目前我的r脚本只是测试它是否可以输出.csv文件)。
此消息通常在文件不存在时发生,但在这种情况下我认为它出现是因为我的r脚本中的参数期望一个文件作为命令行参数传递 - 这只是没有被提取以当前的方式,我写了我的bash脚本。我认为管道我的python程序的输出与将输出用作我的r脚本的命令行参数相同是错误的吗?
非常感谢。
答案 0 :(得分:2)
是的,frequency.R
(从stdin
读取)稍有变化,可以复制.csv
:
l@np350v5c:~$ cat foo.sh
cat gbr_Country_en_csv_v2.csv | Rscript frequency.R
l@np350v5c:~$ cat frequency.R
f <- file("stdin")
dat <- read.csv(f, header=TRUE)
write.csv(dat, file = "out2.csv")