0

有谁知道如何将 shell 命令的输出(一系列 csvkit 工具调用)流式传输到 jupyter 笔记本单元格,但特别是流式传输到 Pandas DataFrame。从单元格的内容来看,它看起来像这样:

 output = !find /path -name "*.csv" | csvstack ... | csvgrep ... 
 df = DataFrame.read_csv(output)

只有上述不是真正的工作。shell 的输出是非常大的数百万行,Pandas 可以处理得很好,但我不希望输出作为字符串完整地加载到内存中。

我正在寻找一种允许 Pandas 读取输出的管道/流式传输解决方案。

4

3 回答 3

3

我想出了一个解决方法。虽然实际上不是管道,但它节省了一些磁盘 I/O 费用:

import io
import pandas as pd
output = !(your Unix command)
df = pd.read_table(io.StringIO(output.n))
于 2017-03-09T19:12:09.130 回答
0

也许“命名管道”在您的情况下会很有用。

在外壳中:

mkfifo MYFIFO
head myfile.txt > MYFIFO

在笔记本中:

with open('MYFIFO', 'rt') as f:
    print(f.readline())

一些好的互联网搜索应该为您提供安全有效地使用命名管道所需的信息。祝你好运!

于 2016-08-08T20:46:29.680 回答
0

IIUC 你可以通过让 pandas 从 STDIN 读取来做到这一点:

Python脚本:

import sys
import pandas as pd
df = pd.read_csv(sys.stdin)
print(df)

外壳命令行:

!find /path -name "*.csv" | csvstack ... | csvgrep ... | python our_pyscript.py

请注意最后一部分:| python our_pyscript.py

您可能还想检查一下

于 2016-06-12T20:04:19.790 回答