pycurl 和 MLST
pycurl and MLST
出于多种原因,我们想使用 pycurl
来获取存储在 FTP 服务器上的文件的信息,其中 MLST command.
我们用下面的代码几乎得到了我们需要的东西:
# 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
(headers)包含我们需要的内容。如果您尝试 CLI 版本,return 代码也是 CURLE_FTP_COULDNT_RETR_FILE 但文件 /tmp/headers
包含数据。
我们认为这与 MLST
使用控制连接而不是数据连接有关。
有什么想法吗?
编辑 1
我们还没有找到没有 DIRLISTONLY
的方法来获得结果(这很奇怪)。此外,如果我们使用 NOBODY
,我们也得不到答案。
编辑 2
事实证明 result
包含有关目录 (ftp://ftp.ncbi.nlm.nih.gov/genomes/genbank/archaea/
) 的信息而不是文件所以这里的代码是 不正确的.
事实证明这很难(如果不是不可能的话)(参见 EDIT 2)。然而,一个简单的代码允许获得最重要的信息(文件大小和最后修改时间)。
代码基于getinfo method (and the 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
出于多种原因,我们想使用 pycurl
来获取存储在 FTP 服务器上的文件的信息,其中 MLST command.
我们用下面的代码几乎得到了我们需要的东西:
# 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
(headers)包含我们需要的内容。如果您尝试 CLI 版本,return 代码也是 CURLE_FTP_COULDNT_RETR_FILE 但文件 /tmp/headers
包含数据。
我们认为这与 MLST
使用控制连接而不是数据连接有关。
有什么想法吗?
编辑 1
我们还没有找到没有 DIRLISTONLY
的方法来获得结果(这很奇怪)。此外,如果我们使用 NOBODY
,我们也得不到答案。
编辑 2
事实证明 result
包含有关目录 (ftp://ftp.ncbi.nlm.nih.gov/genomes/genbank/archaea/
) 的信息而不是文件所以这里的代码是 不正确的.
事实证明这很难(如果不是不可能的话)(参见 EDIT 2)。然而,一个简单的代码允许获得最重要的信息(文件大小和最后修改时间)。
代码基于getinfo method (and the 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