kri*_*itx 9 python linux ftp ftplib
我使用ftplib连接到ftp站点.我想获取最近上传的文件并下载它.我能够连接到ftp服务器并列出文件,我也将它们放在一个列表中并获得datefield转换.是否有任何功能/模块可以获取最近的日期并从列表中输出整行?
#!/usr/bin/env python
import ftplib
import os
import socket
import sys
HOST = 'test'
def main():
try:
f = ftplib.FTP(HOST)
except (socket.error, socket.gaierror), e:
print 'cannot reach to %s' % HOST
return
print "Connect to ftp server"
try:
f.login('anonymous','al@ge.com')
except ftplib.error_perm:
print 'cannot login anonymously'
f.quit()
return
print "logged on to the ftp server"
data = []
f.dir(data.append)
for line in data:
datestr = ' '.join(line.split()[0:2])
orig-date = time.strptime(datestr, '%d-%m-%y %H:%M%p')
f.quit()
return
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
解决:
data = []
f.dir(data.append)
datelist = []
filelist = []
for line in data:
col = line.split()
datestr = ' '.join(line.split()[0:2])
date = time.strptime(datestr, '%m-%d-%y %H:%M%p')
datelist.append(date)
filelist.append(col[3])
combo = zip(datelist,filelist)
who = dict(combo)
for key in sorted(who.iterkeys(), reverse=True):
print "%s: %s" % (key,who[key])
filename = who[key]
print "file to download is %s" % filename
try:
f.retrbinary('RETR %s' % filename, open(filename, 'wb').write)
except ftplib.err_perm:
print "Error: cannot read file %s" % filename
os.unlink(filename)
else:
print "***Downloaded*** %s " % filename
return
f.quit()
return
Run Code Online (Sandbox Code Playgroud)
一个问题是,是否可以从字典中检索第一个元素?我在这里做的是for循环只运行一次并退出,从而给我第一个排序的值,这很好,但我不认为这样做是一个好习惯..
Mar*_*ryl 11
对于那些寻求在文件夹中查找最新文件的完整解决方案的人:
如果您的FTP服务器支持MLSD命令,则解决方案很简单:
entries = list(ftp.mlsd())
entries.sort(key = lambda entry: entry[1]['modify'], reverse = True)
latest_name = entries[0][0]
print(latest_name)
Run Code Online (Sandbox Code Playgroud)
如果您需要使用过时的LIST命令,则必须解析它返回的专有列表。
常见的* nix列表如下:
entries = list(ftp.mlsd())
entries.sort(key = lambda entry: entry[1]['modify'], reverse = True)
latest_name = entries[0][0]
print(latest_name)
Run Code Online (Sandbox Code Playgroud)
使用这样的清单,此代码将执行以下操作:
from dateutil import parser
# ...
lines = []
ftp.dir("", lines.append)
latest_time = None
latest_name = None
for line in lines:
tokens = line.split(maxsplit = 9)
time_str = tokens[5] + " " + tokens[6] + " " + tokens[7]
time = parser.parse(time_str)
if (latest_time is None) or (time > latest_time):
latest_name = tokens[8]
latest_time = time
print(latest_name)
Run Code Online (Sandbox Code Playgroud)
这是一种相当脆弱的方法。
一种更可靠但效率更低的方法是使用MDTM命令来检索单个文件/文件夹的时间戳:
names = ftp.nlst()
latest_time = None
latest_name = None
for name in names:
time = ftp.voidcmd("MDTM " + name)
if (latest_time is None) or (time > latest_time):
latest_name = name
latest_time = time
print(latest_name)
Run Code Online (Sandbox Code Playgroud)
一些FTP服务器支持专有的非标准-t开关NLST(或LIST)命令。
lines = ftp.nlst("-t")
latest_name = lines[-1]
Run Code Online (Sandbox Code Playgroud)
无论使用哪种方法,一旦拥有latest_name,都可以将其下载为任何其他文件:
file = open(latest_name, 'wb')
ftp.retrbinary('RETR '+ latest_name, file.write)
Run Code Online (Sandbox Code Playgroud)
小智 7
你为什么不使用下一个dir选项?
ftp.dir('-t',data.append)
Run Code Online (Sandbox Code Playgroud)
使用此选项,文件列表按时间顺序从最新到最旧.然后只需检索列表中的第一个文件即可下载.
小智 5
使用NLST,如 Martin Prikryl 的回复所示,您应该使用sorted方法:
ftp = FTP(host="127.0.0.1", user="u",passwd="p")
ftp.cwd("/data")
file_name = sorted(ftp.nlst(), key=lambda x: ftp.voidcmd(f"MDTM {x}"))[-1]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12224 次 |
| 最近记录: |