Pycurl и MLST - PullRequest
       47

Pycurl и MLST

0 голосов
/ 06 ноября 2019

По нескольким причинам мы хотели бы использовать pycurl для получения информации о файле, хранящемся на FTP-сервере, с помощью команды MLST .

Мы получаем почти то, что нам нужноследующий код:

# More or less equivalent to: curl --list -X MLST -D /tmp/headers ftp://ftp.ncbi.nlm.nih.gov/genomes/genbank/archaea/assembly_summary.txt 
import pycurl
try:
    from io import BytesIO
except ImportError:
    from StringIO import StringIO as BytesIO
c = pycurl.Curl()
c.setopt(c.URL, r'ftp://ftp.ncbi.nlm.nih.gov/genomes/genbank/archaea/assembly_summary.txt')
c.setopt(pycurl.DIRLISTONLY, True)
# Use MLST
c.setopt(c.CUSTOMREQUEST, "MLST")
# Write header to buffer
output = BytesIO()
c.setopt(pycurl.HEADERFUNCTION, output.write)
# Perform request
c.perform()
# Print header
result = output.getvalue()
result = result.decode('ISO-8859-1')

perform() завершается с CURLE_FTP_COULDNT_RETR_FILE , но result (заголовки) содержит то, что нам нужно. Если вы попробуете версию CLI, код возврата также будет CURLE_FTP_COULDNT_RETR_FILE, но файл /tmp/headers содержит данные.

Мы думаем, что это связано с тем, что MLST использует управляющее соединение, а не данныесоединение.

Есть идеи?

РЕДАКТИРОВАТЬ 1

Мы не нашли способ получить результат без DIRLISTONLY (что странно). Также, если мы используем NOBODY, мы не получим ответ.

РЕДАКТИРОВАТЬ 2

Оказывается, что result содержит информацию о каталоге (ftp://ftp.ncbi.nlm.nih.gov/genomes/genbank/archaea/) не файл, поэтому код здесь неверен .

1 Ответ

0 голосов
/ 08 ноября 2019

Оказывается, это трудно (если не невозможно) сделать (см. РЕДАКТИРОВАТЬ 2 ). Однако простой код позволяет получить наиболее важную информацию (размер файла и время последней модификации).

Код основан на методе getinfo OPT_FILETIME опция):

import pycurl
try:
    from io import BytesIO
except ImportError:
    from StringIO import StringIO as BytesIO
import datetime
c = pycurl.Curl()
c.setopt(c.URL, r'ftp://ftp.ncbi.nlm.nih.gov/genomes/genbank/archaea/assembly_summary.txt')
c.setopt(pycurl.NOBODY, True)
c.setopt(pycurl.OPT_FILETIME, True)
# Perform request
c.perform()
# Print info
timestamp = c.getinfo(pycurl.INFO_FILETIME)
print(datetime.datetime.fromtimestamp(timestamp))
print(c.getinfo(pycurl.CONTENT_LENGTH_DOWNLOAD))

Конечно, мы используем NOBODY , чтобы избежать загрузки файла.

Это более или менее эквивалентно команде:

$ curl --head ftp://ftp.ncbi.nlm.nih.gov/genomes/genbank/archaea/assembly_summary.txt
Last-Modified: Thu, 07 Nov 2019 11:58:21 GMT
Content-Length: 1207490
Accept-ranges: bytes
...