我有一个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