2017-09-20 17 views
7

Tôi có yêu cầu phải kéo các tệp mới nhất từ ​​thư mục FTP, vấn đề là tên tệp có khoảng trắng và tên tệp có một tệp cụ thể mẫu. Dưới đây là đoạn code tôi đã thực hiện:Lấy các tệp mới nhất từ ​​thư mục FTP (tên tệp có dấu cách) trong Python

import sys 
from ftplib import FTP 
import os 
import socket 
import time 
import pandas as pd 
import numpy as np 
from glob import glob 
import datetime as dt 
from __future__ import with_statement 

ftp = FTP('') 
ftp.login('','') 
ftp.cwd('') 
ftp.retrlines('LIST') 

filematch='*Elig.xlsx' 
downloaded = [] 

for filename in ftp.nlst(filematch): 
    fhandle=open(filename, 'wb') 
    print 'Getting ' + filename 
    ftp.retrbinary('RETR '+ filename, fhandle.write) 
    fhandle.close() 
    downloaded.append(filename) 

ftp.quit() 

Tôi hiểu rằng tôi có thể thêm một danh sách trống để ftp.dir() chỉ huy, nhưng kể từ khi tên tập tin là có khoảng trống, tôi không thể chia nó ở bên phải và chọn tệp mới nhất của loại mà tôi đã đề cập ở trên.

Mọi trợ giúp đều tuyệt vời.

+1

Hành vi của chương trình được đăng là gì? Nó có hoạt động đúng không? Nó có in thông báo lỗi không? Có phải làm cái gì khác hoàn toàn? –

+0

Nó hoạt động tốt để kéo các tập tin mà tôi muốn và tôi đã làm như vậy cho một quá trình một thời gian. Nhưng sau đó, tôi cần tự động hóa nó và bắt đầu chỉ chọn các tệp mới nhất, dựa trên ngày tháng. –

+0

Để tham khảo trong tương lai, hãy cho chúng tôi một tên tệp ví dụ sẽ gọn gàng. Chỉ để chúng tôi biết nó trông như thế nào. – Torxed

Trả lời

4

Bạn có thể nhận được các tập tin mtime bằng cách gửi lệnh MDTM iff máy chủ FTP hỗ trợ nó và sắp xếp các tập tin trên máy chủ FTP cho phù hợp.

def get_newest_files(ftp, limit=None): 
    """Retrieves newest files from the FTP connection. 

    :ftp: The FTP connection to use. 
    :limit: Abort after yielding this amount of files. 
    """ 

    files = [] 

    # Decorate files with mtime. 
    for filename in ftp.nlst(): 
     response = ftp.sendcmd('MDTM {}'.format(filename)) 
     _, mtime = response.split() 
     files.append((mtime, filename)) 

    # Sort files by mtime and break after limit is reached. 
    for index, decorated_filename in enumerate(sorted(files, reverse=True)): 
     if limit is not None and index >= limit: 
      break 

     _, filename = decorated_filename # Undecorate 
     yield filename 


downloaded = [] 

# Retrieves the newest file from the FTP server. 
for filename in get_newest_files(ftp, limit=1): 
    print 'Getting ' + filename 

    with open(filename, 'wb') as file: 
     ftp.retrbinary('RETR '+ filename, file.write) 

    downloaded.append(filename) 
+0

Tôi đã thử chạy mã này nhưng vẫn kéo tất cả các tệp từ ftp của loại tương ứng và không phải là tệp mới nhất của chúng. –

+1

Cảm ơn bạn rất nhiều! Điều này làm việc ... Tôi chỉ cần thêm các đối số để đảo ngược các sắp xếp (tập tin), để chọn lên các tập tin mới nhất và cũng thay đổi giới hạn đến 1 để chỉ nhận các tập tin mới nhất. Một lần nữa, cảm ơn bạn đã giúp đỡ! –

0

Vấn đề là lệnh "LIST" của FTP trả về văn bản cho con người, định dạng phụ thuộc vào việc triển khai máy chủ FTP.

Sử dụng PyFilesystem (thay cho ftplib chuẩn) và API của nó sẽ cung cấp API "danh sách" (tìm kiếm "đi bộ") cung cấp cấu trúc Pythonic của danh sách tệp và thư mục được lưu trữ trong máy chủ FTP.

http://pyfilesystem2.readthedocs.io/en/latest/index.html

Các vấn đề liên quan