2016-10-05 43 views
0

我无法理解如何使用subprocess解决我的问题。如何使用子进程和'cat'逐行读入数据?

假设我在我的子目录中有一个制表符分隔的文本文件tabdelimited1.txt,我想读入熊猫数据框。

当然,你可以简单地导入数据如下:

import pandas as pd 
df = pd.read_csv("tabdelimited1.txt", header=None, sep="\s+") 

然而,假设我们想用subprocess。在命令行中,$cat tabdelimited1.txt将输出所有行。

现在,我想使用子进程读取cat tabdelimited1.txt的输出。如何做到这一点?

我们可以使用

import subprocess 
task = subprocess.Popen("cat file.txt", shell=True, stdout=subprocess.PIPE) 
data = task.stdout.read() 

,但(1)我得到shell=True和(2)我想在数据线,由线到读取错误。

如何使用subprocess逐行读取tabdelimited1.txt?这个脚本应该是这个样子:

import subprocess 
import pandas as pd 

df = pd.DataFrame() 
task = subprocess.Popen("cat file.txt", shell=True, stdout=subprocess.PIPE) 
# while lines exist: 
    # line = subprocess std 
    df=pd.concat([df, line]) 

EDITED

+0

你用'shell = True'得到了什么错误? – tdelaney

+0

子进程模块与从管道输入读取无关,你只需要[从sys.stdin读取](http://stackoverflow.com/questions/17658512/how-to-pipe-in​​put-to-python -linux-program-in-line-from-line-from-linux-program)for cat x.txt | python script1.py'。 – TessellatingHeckler

+0

@TessellatingHeckler但是OP想要使用'subprocess'。 – tdelaney

回答

2

您可以通过打破了命令成一个列表完全跳过壳。然后,它只是迭代过程标准输出的问题:

import subprocess 
import pandas as pd 

df = pd.DataFrame() 
task = subprocess.Popen(["cat", "file.txt"], stdout=subprocess.PIPE) 
for line in task.stdout: 
    df=pd.concat([df, line]) 
task.wait() 
+0

你能解释一下如何在任务中使用线。 stdout'和'task.wait()'工作吗?'task.stdout'是一个包含'cat file.txt'全部内容的变量吗? – ShanZhengYang

+0

这个和OP'shell = True'版本都适合我。 – hpaulj

+2

'task.stdout'就像'sys.stdout'和任何打开的文件;迭代它逐行读取它。 – hpaulj

0
import sys 
for line in sys.stdin: 
    print(line.split()) 

可以像一个shell命令一起使用:

0025:~/mypy$ cat x.txt | python3 stack39864304.py 
['1', '3', 'test1;'] 
['2', '2', 'test2;'] 
['3', '2', 'test3;'] 

否则在互动会议上,我可以这样做:

In [269]: task = subprocess.Popen("cat x.txt", shell=True, stdout=subprocess.PIPE) 
In [270]: for line in task1.stdout:print(line.split()) 
[b'1', b'3', b'test1;'] 
[b'2', b'2', b'test2;'] 
[b'3', b'2', b'test3;'] 

(py3字节串)

python3 stack39864304.py < x.txt是将此文件发送到脚本的另一种方式。

cat afile | ...可能太简单了,并提出所有关于为什么不直接阅读的反对意见。但cat可以替换为head,tail或甚至ls -l | python3 stack39864304.py以获得与此split目录列表。

我使用ipython为我的大多数交互式python编码;它的许多%magic使用子进程;我使用cat x.txt,ls在本次会议之内。

+0

因此,'sys.stdin'需要一个命令'cat x.txt'。与使用'task = subprocess.Popen()'相比,是否有其他差异(例如性能等)? – ShanZhengYang

+0

'stdin'从管道或' hpaulj

+0

谢谢---顺便说一句,我不确定你为什么被拒绝投票---我当然很欣赏他的回应和贡献 – ShanZhengYang