【问题标题】:piping from shell into jupyter notebook cell从外壳到 jupyter 笔记本单元的管道
【发布时间】:2023-05-17 03:16:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • .@Dmitry 将 csv 读入剪贴板,然后 pd。读剪贴板?就目前所知,熊猫不处理流..

标签: python pandas jupyter-notebook csvkit


【解决方案1】:

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

import io
import pandas as pd
output = !(your Unix command)
df = pd.read_table(io.StringIO(output.n))

【讨论】:

  • 对于那些需要区分标准输出和标准错误的人来说,%%capture 单元魔法提供了一个不错的选择。请参阅 herehere。看起来类似于 oLas 的答案 here 使用 %%bash 细胞魔法,但提供了另一条路线。
【解决方案2】:

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

Python 脚本:

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

Shell 命令行:

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

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

您可能还想查看this

【讨论】:

    【解决方案3】:

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

    在外壳中:

    mkfifo MYFIFO
    head myfile.txt > MYFIFO
    

    在笔记本中:

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

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

    【讨论】:

      最近更新 更多