2016-11-28 88 views
0

我有一個Python腳本,它需要一個--file xyz.json參數。作爲文件嘲笑stdin

事情是,我的JSON是巨大的,因此它是Gzipped。當然,我可以解壓縮然後運行腳本,但這看起來很浪費。有沒有一種巧妙的方式可以讓我在做zcat xyz.json.gz | myscript.py --file ?????的同時工作。我不想修改myscript.py來讀取stdin而不是文件,除非無法以其他方式完成此操作。

謝謝!

+0

約慶典** [進程替換]什麼(https://www.gnu.org/software/bash/manual/html_node/Process- Substitution.html)**? 'myscript.py --file <(zcat file.gz)'?請注意,這可能同樣浪費 - 儘管它可能更方便。 – ghoti

回答

4

嘗試:

myscript.py --file <(zcat xyz.json.gz) 

返回含有管的文件描述符。假設腳本只是讀取文件,而不向前和向後搜索,這應該工作。

<(...)被稱爲process substitution

至於發生什麼的詳細闡述:

% awk 'BEGIN{print "filename:", ARGV[1]};1' <(echo first; sleep 1; echo second) 
filename: /proc/self/fd/11 
first 
second 

second被延遲一段時間後打印。所以:awk獲取文件名稱/proc/self/fd/11,並開始處理它。它會立即看到第一行,並將其打印出來。然後,在睡覺之後,它會看到第二行,並打印出來。

+0

在執行main命令之前,這會提取'xyz.json.gz'還是會將文件內容'stream'解壓縮? – user1265125

+0

這將產生一個流。它就像蟒蛇的「屈服」,或者更精確一些,就像一根管子。 – joepd

+0

我很好奇這將如何在Python結束。代碼期望--file參數是一個字符串文件路徑,並且它試圖用'open()'打開文件路徑。那麼這個流程替換是否會傳遞一個代表臨時文件的字符串呢? – user1265125

2

可以使用/dev/stdin或(等效)/dev/fd/0

zcat xyz.json.gz | myscript.py --file /dev/stdin 
zcat xyz.json.gz | myscript.py --file /dev/fd/0 
+0

假定您的文件系統中存在'/ dev/stdin'。 'bash'只有在它是重定向的目標時纔會專門處理它。 – chepner

+0

@chepner:有趣的,好的。 '/ dev/stdin'會丟失什麼樣的系統? – ruakh

+0

最相關的是「Python在沒有本地支持/ dev/stdin的系統上專門處理名稱/ dev/stdin?」 - 我不知道答案。我知道我在我的一個節目中增加了這種支持 - 大約在20年前,哦,就像現在這樣普遍。我不知道大多數人是否做到了這一點。 –