如何使用subprocess和'cat'逐行读入数据?

How to use subprocess and 'cat' to read in data line by line?

我无法理解如何使用 subprocess 解决我的问题。

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

当然,您可以按如下方式简单地导入数据:

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])

已编辑

您可以通过将命令分成列表来完全跳过 shell。然后它只是迭代过程标准输出的问题:

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()
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 可以替换为 headtail 甚至 ls -l | python3 stack39864304.py 以获取具有此 split.

的目录列表

我使用 ipython 进行大部分交互式 python 编码;它的许多 %magic 使用子流程;我在这个会话中一直使用 cat x.txtls