我有一個Python腳本,它需要一個--file xyz.json
參數。作爲文件嘲笑stdin
事情是,我的JSON是巨大的,因此它是Gzipped。當然,我可以解壓縮然後運行腳本,但這看起來很浪費。有沒有一種巧妙的方式可以讓我在做zcat xyz.json.gz | myscript.py --file ?????
的同時工作。我不想修改myscript.py
來讀取stdin而不是文件,除非無法以其他方式完成此操作。
謝謝!
我有一個Python腳本,它需要一個--file xyz.json
參數。作爲文件嘲笑stdin
事情是,我的JSON是巨大的,因此它是Gzipped。當然,我可以解壓縮然後運行腳本,但這看起來很浪費。有沒有一種巧妙的方式可以讓我在做zcat xyz.json.gz | myscript.py --file ?????
的同時工作。我不想修改myscript.py
來讀取stdin而不是文件,除非無法以其他方式完成此操作。
謝謝!
嘗試:
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
,並開始處理它。它會立即看到第一行,並將其打印出來。然後,在睡覺之後,它會看到第二行,並打印出來。
在執行main命令之前,這會提取'xyz.json.gz'還是會將文件內容'stream'解壓縮? – user1265125
這將產生一個流。它就像蟒蛇的「屈服」,或者更精確一些,就像一根管子。 – joepd
我很好奇這將如何在Python結束。代碼期望--file參數是一個字符串文件路徑,並且它試圖用'open()'打開文件路徑。那麼這個流程替換是否會傳遞一個代表臨時文件的字符串呢? – user1265125
可以使用/dev/stdin
或(等效)/dev/fd/0
:
zcat xyz.json.gz | myscript.py --file /dev/stdin
zcat xyz.json.gz | myscript.py --file /dev/fd/0
約慶典** [進程替換]什麼(https://www.gnu.org/software/bash/manual/html_node/Process- Substitution.html)**? 'myscript.py --file <(zcat file.gz)'?請注意,這可能同樣浪費 - 儘管它可能更方便。 – ghoti