2016-10-05 44 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