[PYTHON] Python FTP는 날짜별로 최신 파일을 가져옵니다.
PYTHONPython FTP는 날짜별로 최신 파일을 가져옵니다.
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()
해결사 :
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
한 가지 문제는 사전에서 첫 번째 요소를 검색 할 수 있습니까? 내가 여기서 한 것은 for 루프가 한 번만 실행되고 나에게 첫 번째 정렬 된 값을 제공하기 때문에 종료되지만이 방법으로 수행하는 것이 좋다고 생각하지 않는다는 것입니다.
해결법
-
==============================
1.time.struct_time에 모든 날짜가 있으면 (목록에서 strptime이이를 제공합니다) 목록을 정렬하면 목록을 정렬 할 수 있습니다.
time.struct_time에 모든 날짜가 있으면 (목록에서 strptime이이를 제공합니다) 목록을 정렬하면 목록을 정렬 할 수 있습니다.
다음은 그 예입니다.
#!/usr/bin/python import time dates = [ "Jan 16 18:35 2012", "Aug 16 21:14 2012", "Dec 05 22:27 2012", "Jan 22 19:42 2012", "Jan 24 00:49 2012", "Dec 15 22:41 2012", "Dec 13 01:41 2012", "Dec 24 01:23 2012", "Jan 21 00:35 2012", "Jan 16 18:35 2012", ] def main(): datelist = [] for date in dates: date = time.strptime(date, '%b %d %H:%M %Y') datelist.append(date) print datelist datelist.sort() print datelist if __name__ == '__main__': main()
-
==============================
2.왜 다음 dir 옵션을 사용하지 않으시겠습니까?
왜 다음 dir 옵션을 사용하지 않으시겠습니까?
ftp.dir('-t',data.append)
이 옵션을 사용하면 파일 목록이 최신순에서 오래된 순으로 정렬됩니다. 그런 다음 목록에서 첫 번째 파일을 검색하여 다운로드하십시오.
-
==============================
3.폴더에서 최신 파일을 찾는 완벽한 솔루션을 찾는 사람들을 위해 :
폴더에서 최신 파일을 찾는 완벽한 솔루션을 찾는 사람들을 위해 :
FTP 서버가 MLSD 명령을 지원한다면, 해결책은 간단합니다 :
entries = list(ftp.mlsd()) entries.sort(key = lambda entry: entry[1]['modify'], reverse = True) latest_name = entries[0][0] print(latest_name)
구식의 LIST 명령에 의존해야한다면 반환하는 소유권 목록을 파싱해야합니다.
Common * nix 목록은 다음과 같습니다.
-rw-r--r-- 1 user group 4467 Mar 27 2018 file1.zip -rw-r--r-- 1 user group 124529 Jun 18 15:31 file2.zip
이와 같은 목록으로이 코드는 다음을 수행합니다.
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)
이것은 다소 연약한 접근법입니다.
보다 안정적이지만 효율성이 떨어지는 방법은 MDTM 명령을 사용하여 개별 파일 / 폴더의 타임 스탬프를 검색하는 것입니다.
names = ftp.nlst() latest_time = None latest_name = None for name in names: time = ftp.sendcmd("MDTM " + name) if (latest_time is None) or (time > latest_time): latest_name = name latest_time = time print(latest_name)
일부 FTP 서버는 NLST (또는 LIST) 명령에 대해 독점적 인 비표준 -t 스위치를 지원합니다.
lines = ftp.nlst("-t") latest_name = lines[-1]
수정 시간순으로 정렬 된 FTP 폴더에서 파일을받는 방법을 참조하십시오.
어떤 접근 방식을 사용하든 상관없이 latest_name을 사용하면 다른 파일로 다운로드 할 수 있습니다.
file = open(latest_name, 'wb') ftp.retrbinary('RETR '+ latest_name, file.write)
파이썬에서 최신 FTP 폴더 이름 얻기.
-
==============================
4.나는 그것이 당신의 ftp 인 방법을 모른다. 그러나 당신의 예는 나를 위해 일하지 않고 있었다. 날짜 정렬 부분과 관련된 몇 줄을 변경했습니다.
나는 그것이 당신의 ftp 인 방법을 모른다. 그러나 당신의 예는 나를 위해 일하지 않고 있었다. 날짜 정렬 부분과 관련된 몇 줄을 변경했습니다.
import sys from ftplib import FTP import os import socket import time # Connects to the ftp ftp = FTP(ftpHost) ftp.login(yourUserName,yourPassword) data = [] datelist = [] filelist = [] ftp.dir(data.append) for line in data: col = line.split() datestr = ' '.join(line.split()[5:8]) date = time.strptime(datestr, '%b %d %H:%M') datelist.append(date) filelist.append(col[8]) 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: ftp.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 ftp.quit()
from https://stackoverflow.com/questions/8990598/python-ftp-get-the-most-recent-file-by-date by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 목록에 Python으로 다른 목록이 포함되어 있는지 테스트하기 (0) | 2018.10.15 |
---|---|
[PYTHON] 모든 고유 한 값을 갖는 2D 배열을 생성하기 위해 임의 선택 (0) | 2018.10.15 |
[PYTHON] 사용자 입력에서 동적으로 명명 된 변수 만들기 [duplicate] (0) | 2018.10.15 |
[PYTHON] 모듈 가져 오기 : __main__ 대 모듈 가져 오기 (0) | 2018.10.15 |
[PYTHON] 쓰레드를 죽일 방법이 있습니까? (0) | 2018.10.15 |