问题描述
我在此stackoverflow中的第一篇文章! :)
我正在尝试使用Python导入表(R脚本的输出)。 避免翻译为设计R中的复杂data.table的庞大脚本而工作。
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(table,“ ISO-8859-1”)一样在str中尝试使用此“ ISO-8859-1”似乎可以,并且我注意到脚本中有多个表。 我正在以一种干净的方式重新运行一切,希望它能正常工作! :)
解决方法
对于一般的任何进程,可以按以下方式捕获标准输出:
postgres
这是一个阻塞调用,这意味着执行将在table = proc.stdout.read()处停止。
注意 上面的代码可能无法满足大型表的要求,因为该过程将在很长一段时间内阻塞在上面显示的行。
,我来看看r2py界面。这使您可以从R转换为熊猫对象:https://pandas.pydata.org/pandas-docs/version/0.22.0/r_interface.html。
您可以将表存储在RData文件中,然后将其加载到python中。
,考虑将R脚本调整为使用write.csv()
作为最后一行,而没有将文件转储到控制台。这将允许引用字符串值。然后在Python中,使用subprocess.Popen
接收带有字节处理的输出,以移植到Pandas数据帧中。
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中。
,您可以将R数据帧复制到剪贴板,然后使用“从剪贴板读取”将其加载到Pandas。这是它的工作原理。
使用此代码将R数据帧复制到剪贴板,然后转到Jupyter并使用pd.read_clipboard()。
# If you are on Windows,use:
# R-Studio
write.table(df,"clipboard",sep="\t",col.names=TRUE)
# Jupyter
df = pd.read_clipboard(sep="\t")
# On Mac,use:
# R-Studio
clip <- pipe("pbcopy","w")
write.table(df,file=clip)
close(clip)
# Jupyter Notebook
df = pd.read_clipboard()