pycurl和MLST

问题描述 投票:0回答:1

由于多种原因,我们想使用pycurl来获取有关通过MLST command在FTP服务器上存储的文件的信息。

我们通过以下代码获得了所需的一切:

# 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/)的信息而不是文件,因此此处的代码为不正确

ftp pycurl
1个回答
0
投票

事实证明,这样做很难(如果不是不可能的话)(请参阅EDIT 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
© www.soinside.com 2019 - 2024. All rights reserved.