2017-02-14 3 views
2

В идеале, что я хотел бы сделать, это реплицировать этот конвейль bash в python (я использую cut здесь, чтобы представить произвольное преобразование данных. Я действительно хочу использовать pandas, чтобы это сделать) :Трубопровод от ftplib от Python без блокировки

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

Я могу написать следующий код питона, который достигает той же цели

# 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) 

Однако, блоки ftp.retrbinary() вызовов, и ждет всей загрузки. Я хочу иметь один длинный двоичный поток с файлом FTP в качестве источника с gunzip в качестве фильтра и pd.read_csv() в качестве раковины, одновременно обрабатывая данные, как в моем проекте bash. Есть ли способ остановить retrbinary() от блокировки?

Я понимаю, что это невозможно, потому что python не может использовать более одного потока. Это правда? Если да, то я могу использовать multiprocessing или async или какой-либо другой функции языка, чтобы достичь этого одновременного Трубопроводный

редактировать: изменены storbinary к retrbinary, это была опечатка и проблема все еще стоит

+0

Python может полностью использовать несколько потоков. Вы думаете о GIL, который отличается. –

ответ

0

Вы должны быть в состоянии загрузите файл непосредственно на адрес GZipFile:

gzipfile = gzip.GzipFile() 
ftp.storbinary(f'RETR goldenPath/{args.reference}/database/refFlat.txt.gz', gzipfile.write) 
Смежные вопросы