2017-02-14 12 views
2

私がしたいことは理想的には、このbashパイプラインをPythonで複製することです(私は実際にはpandasを使ってこのようにしたいと思っています) :Pythonのftplibからブロックせずにパイプする

curl ftp://hgdownload.cse.ucsc.edu/goldenPath/hg38/database/refFlat.txt.gz | gunzip | cut -f 1,2,4 

私は、全体のダウンロードのために、しかしftp.retrbinary()コール・ブロック、および待機を同じ目標

# Download the zip file into memory 
file = io.BytesIO() 
ftp = ftplib.FTP('hgdownload.cse.ucsc.edu') 
ftp.retrbinary(f'RETR goldenPath/{args.reference}/database/refFlat.txt.gz', file.write) 

# Unzip the gzip file 
table = gzip.GzipFile(fileobj=file) 

# Read into pandas 
df = pd.read_csv(table) 

を達成する、Pythonで次のコードを書くことができます。私が望むのは、FTPファイルをソースとして使用し、gunzipをフィルタとして使用し、シンクとしてpd.read_csv()を使用して、すべてのデータを同時に処理する、長いバイナリストリームをbashパイプラインで使用することです。 retrbinary()がブロックされないようにする方法はありますか?

私はこれが不可能かもしれないことに気付きました。なぜなら、Pythonは複数のスレッドを使うことができないからです。これは本当ですか?もしそうなら、私は

編集この同時パイプラインを実現するためにmultiprocessingまたはasyncまたはいくつかの他の言語機能を使用することができます:retrbinarystorbinaryを変更し、これはタイプミスだったとの問題は、まだあなたのことができるようにする必要があり

+0

Pythonは完全に複数のスレッドを使用できます。あなたは違うGILを考えています。 –

答えて

0

スタンドファイルを直接GZipFileにダウンロードしてください:

gzipfile = gzip.GzipFile() 
ftp.storbinary(f'RETR goldenPath/{args.reference}/database/refFlat.txt.gz', gzipfile.write) 
関連する問題