> 4gbのファイルmyfile.gzを指定すると、Teradataの高速ロードで消費するためにパイプにzcatする必要があります。私はまた、ファイル内の行の数を数える必要があります。理想的には、ファイルを1回だけ通過させたいと思っています。私はawkを使ってstdoutに行全体($ 0)を出力し、awkのEND句を使って行数(awkのNR変数)を別のファイル記述子(outfile)に書き出します。ファイルの内容をパイプに送り、1行で#行を数える
私はawkを使ってこれを行うことができましたが、もっとpythonicな方法が存在するかどうかを知りたいと思います。
#!/usr/bin/env python
from subprocess import Popen, PIPE
from os import path
the_file = "/path/to/file/myfile.gz"
outfile = "/tmp/%s.count" % path.basename(the_file)
cmd = ["-c",'zcat %s | awk \'{print $0} END {print NR > "%s"} \' ' % (the_file, outfile)]
zcat_proc = Popen(cmd, stdout = PIPE, shell=True)
パイプが後
"/dev/fd/" + str(zcat_proc.stdout.fileno())
これは動作しますが、私はその可能な場合のawkをスキップしてのpythonのより良い活用するために知りたいから読み込むのTeradataの高速読み込みの呼び出しによって消費され。私は他の方法にもオープンしています。私はこの方法で処理する必要がある複数の大きなファイルを持っています。
これはほぼそのまま動作しますが、Fastloadの実装の欠点の1つは、ファストロード制御ファイル自体が標準でなければならないということです。したがって、gunzipのデータは別のソースから取得する必要があります。シェルコマンドを呼び出さなくても、名前付きパイプをPythonで開く方法はありますか? –
@NeilKodner:おそらく最も簡単な方法は、['os.mkfifo()'](http://docs.python.org/library/os.html#os.mkfifo)を使って名前付きパイプを作ることです。私は私の答えを更新します... –