2016-06-12 20 views
0

Wer weiß, wie die Ausgabe eines Shell-Befehls (eine Kette von csvkit Tool-Aufrufe) in eine Jupiter-Notebook-Zelle, sondern speziell in einen Pandas DataFrame streamen. Aus dem Inhalt der Zelle würde es in etwa so aussehen:Rohrleitungen von Shell in Jupyter Notebook Zelle

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

nur das obige ist nicht wirklich funktionieren. Die Ausgabe der Shell ist sehr groß Millionen von Zeilen, die Pandas nur gut behandeln kann, aber ich möchte nicht, dass die Ausgabe als String vollständig in den Speicher geladen wird.

Ich bin auf der Suche nach einer Piping/Streaming-Lösung, die es Pandas erlaubt, die Ausgabe so zu lesen, wie sie kommt.

+0

. @ Dmitry Lesen Sie CSV in die Zwischenablage, dann pd. read_clipboard? Wie weit kennt ein Pandas nicht mit Streams .. – Merlin

Antwort

0

IIUC Sie können es durch Pandas lesen aus STDIN lassen:

Python-Skript:

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

Shell-Befehlszeile:

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

achten Sie bitte auf den letzten Teil: | python our_pyscript.py

Sie können auch überprüfen k this

+0

Jupyter Notebook läuft als Server. Dies wird nicht funktionieren –

0

Vielleicht wären "Named Pipes" in Ihrem Fall nützlich.

In Schale:

mkfifo MYFIFO 
head myfile.txt > MYFIFO 

In Notebook:

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

Ein paar guten Internet-Recherchen sollten Sie die Informationen, die Sie benötigen, sicher und effektiv Named Pipes zu verwenden. Viel Glück!

1

Ich habe einen Workaround gefunden. Obwohl es nicht wirklich Rohrleitungen, aber es spart einige Datenträger I/O Kosten:

Verwandte Themen