복붙노트

[PYTHON] Python FTP는 날짜별로 최신 파일을 가져옵니다.

PYTHON

Python 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. ==============================

    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. ==============================

    2.왜 다음 dir 옵션을 사용하지 않으시겠습니까?

    왜 다음 dir 옵션을 사용하지 않으시겠습니까?

    ftp.dir('-t',data.append)
    

    이 옵션을 사용하면 파일 목록이 최신순에서 오래된 순으로 정렬됩니다. 그런 다음 목록에서 첫 번째 파일을 검색하여 다운로드하십시오.

  3. ==============================

    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. ==============================

    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()
    
  5. from https://stackoverflow.com/questions/8990598/python-ftp-get-the-most-recent-file-by-date by cc-by-sa and MIT license