首页 > 解决方案 > 使用 Python 导入 R 脚本的输出

问题描述

我在这个 stackoverflow 中的第一篇文章!:)

我正在尝试使用 Python 导入表(R 脚本的输出)。这对于避免翻译在 R 中设计复杂 data.table 的巨大脚本非常有帮助。

现在我知道如何使用以下代码使用 Python 调用 R 脚本:

import os 
import subprocess
 
#Launch selected script
command = 'C:/Program Files/R/R-3.4.0/bin/x64/Rscript.exe'
path2script = 'C:/mypath/myscript.R'
cmd = [command, path2script]
a = subprocess.call(cmd)

但是后来我不知道如何使用我的 Python 脚本来使用表格、R 代码的输出。你有什么想法吗?

非常感谢

编辑:

我尝试了下面@punter 的解决方案

import subprocess

with subprocess.Popen(['/command/to/run', '/other/parameters'], stdout=subprocess.PIPE) as proc:
    table = proc.stdout.read()

但是表格是这样一种奇怪的格式:(它是一个子集)

A\r\n COL1 COL2 COL3\r\n 1: 2015-06-17 05:19 NA <NA>\r\n 2: 2015-06-17 05:19 NA <NA>\r\n 3: 2015-06-17 05:19 NA <NA>\r\n 4: 2015-06-17 05:19 NA <NA>\r\n 5: 2015-06-17 05:19:29 NA <NA>\r\n 

当我尝试下面的代码时,我得到了列名中的所有内容

s=str(table) 
data = StringIO(s) 
df=pd.read_csv(data)

[0 行 x 111 列]

编辑编号 2

在 str(table, "ISO-8859-1") 之类的 str 中尝试使用这个“ISO-8859-1”似乎正在工作,我可以注意到我的脚本中有多个表。我正在以一种干净的方式重新运行所有内容,我希望它会起作用!:)

标签: pythonrpython-requestssubprocessmethod-call

解决方案


考虑调整 R 脚本以用作没有write.csv()文件名的最后一行以将数据转储到控制台。这将允许引用字符串值。然后在 Python 中,用于接收带有字节处理的输出,以便迁移到 Pandas 数据帧中。subprocess.Popen

R

...

write.csv(my_r_df, file="", row.names=FALSE)

Python

import subprocess
from io import StringIO
import pandas as pd
 
# RUN R SCRIPT
command = r'C:\Path\To\Rscript.exe'
path2script = r'C:\Path\To\R\Code.R'

a = subprocess.Popen([command, path2script], 
                      stdin=subprocess.PIPE, 
                      stdout=subprocess.PIPE, 
                      stderr=subprocess.PIPE)
                      
output, error = a.communicate()

# IMPORT PANDAS DATA FRAME
my_pandas_df = pd.read_csv(StringIO(output.decode('utf-8')))

my_pandas_df

当然,您也可以让 R 简单地将数据写入 .csv,然后导入 Pandas。


推荐阅读