

pandas で標準入力 (STDIN) から `read_csv` のように読み込むこと可能でしょうか？

STDIN を変数に入れて、それを stringIO
にして読み込むのは可能なのですが、もっとスマートにやる方法はないでしょうか？理想としては、jupyter
環境でストリーム（標準出力など）を設定して、次に、そのストリームをpandas で読み込むようなことをしたいです。


CC BY-SA 4.0
2020-12-05T09:20:05.360
72422
2021-02-02T06:01:41.597
2020-12-05T11:35:42.943
3060
5922
question
python pandas
pandas で標準入力からデータ読み込む方法


この記事がそれを扱っています。  
[【python】io.StringIOは便利なので使いこなそう](https://www.haya-
programming.com/entry/2018/07/03/042203)

>
[code]

>     import io
>     import pandas as pd
>  
>     txt = """
>     number,name,score
>     1,hoge,100
>     2,fuga,200
>     3,piyo,300
>     """
>  
>     df = pd.read_csv(io.StringIO(txt), index_col="number")
>     print(df)
>  
[/code]

他にはjsonの読み出しですが、こちらの記事で`sys.stdin`を直接指定して出来ています。  
記事は2.x系の`print df`でしたので下記引用では3.x系の`print(df)`に変えています。  
[Pandas data from stdin](https://stackoverflow.com/q/18495846/9014308)

>
[code]

>     import sys
>     import pandas as pd
>  
>     df = pd.read_json(sys.stdin)
>     print(df)
>  
[/code]

`read_json`を`read_csv`に変えても問題無く動作しました。

それからこちらはsubprocessで出力したデータをstringIOに変換して読み取るやり方です。  
Unix上の例なので試していませんが、承認されているので動作するでしょう。  
[Input for read_csv pandas
function](https://stackoverflow.com/q/46568988/9014308)

>
[code]

>     import io
>     import subprocess
>     import pandas
>  
>     cmd = ('cat', '/tmp/csvfile')
>     process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
>     csv = io.StringIO()
>     for line in process.stdout:
>         csv.write(line.decode().strip('"\n') + '\n')
>     csv.seek(0)
>     data = pandas.read_csv(csv, index_col=0)
>     csv.close()
>  
[/code]


CC BY-SA 4.0
2020-12-05T10:41:34.663
72425
2020-12-05T10:57:54.667
2020-12-05T10:57:54.667
26370
26370
72422
answer


`何らかの PG | python readcsv.py`  
のように起動するのなら次のようにするとよいです

[code]

    import sys
    import pandas as pd
    
    df = pd.read_csv(sys.stdin)
    print(df)
    
[/code]

jupyterで入力する場合ならこんな風にできます

[code]

    import pandas as pd
    
    stdin = input()
    df = pd.read_csv(stdin)
    print(df)
    
[/code]

* * *

### 追記

Jupyterで sub-process走らせて結果を取り込むのは次のようにできます

[code]

    変数 = !何らかのコマンド
    
[/code]

なので, CSVや JSONは次のようにできます (UNIX系の場合)

[code]

    out = !echo -e "A,B,C\n10,20,30\n40,50,60"
    outj = !ip -j addr
    import pandas as pd
    import io
    display(pd.read_csv(io.StringIO(out.n)))
    display(pd.read_json(io.StringIO(outj.n)))
    
[/code]

他に, 対象のセルをキャプチャーする方法 (`%%capture result`) もあるけど `StringIO`使うところは同じ

### 更に追加

PIPE使って sub-processなら, 代入の手間は必要ないが, コードが必要

[code]

    from subprocess import Popen, PIPE
    cmd = 'ip -j addr'.split(' ')
    with Popen(cmd, stdout=PIPE, stderr=PIPE, text=True) as proc:
        df = pd.read_json(proc.stdout)
    display(df)
    
[/code]


CC BY-SA 4.0
2020-12-05T11:24:16.980
72428
2021-02-02T06:01:41.597
2021-02-02T06:01:41.597
43025
43025
72422
answer