2012-05-17 28 views
8

Tôi đã sử dụng pycurl để truyền tệp qua ftp trong python. Tôi có thể tự động tạo các thư mục bị thiếu trên máy chủ từ xa của mình bằng cách sử dụng:Tạo các thư mục bị thiếu trong ftplib storbinary

c.setopt(pycurl.FTP_CREATE_MISSING_DIRS, 1) 

vì một số lý do, tôi phải chuyển sang ftplib. Nhưng tôi không biết cách làm như thế ở đây. Có tùy chọn để thêm vào chức năng storbinary để làm điều đó? hoặc tôi phải tạo các thư mục theo cách thủ công?

Trả lời

9

FTP_CREATE_MISSING_DIRS là một hoạt động curl (added here). Tôi sẽ nguy hiểm khi đoán rằng bạn phải làm điều đó bằng tay với ftplib, nhưng tôi muốn được chứng minh là sai, bất cứ ai?

Tôi muốn làm điều gì đó như sau: (chưa được kiểm tra, và cần phải bắt ftplib.all_errors)

ftp = ... # Create connection 

# Change directories - create if it doesn't exist 
def chdir(dir): 
    if directory_exists(dir) is False: # (or negate, whatever you prefer for readability) 
     ftp.mkd(dir) 
    ftp.cwd(dir) 

# Check if directory exists (in current location) 
def directory_exists(dir): 
    filelist = [] 
    ftp.retrlines('LIST',filelist.append) 
    for f in filelist: 
     if f.split()[-1] == dir and f.upper().startswith('D'): 
      return True 
    return False 

Hoặc bạn có thể làm directory_exists như thế này: (một chút khó khăn hơn để đọc?)

# Check if directory exists (in current location) 
def directory_exists(dir): 
    filelist = [] 
    ftp.retrlines('LIST',filelist.append) 
    return any(f.split()[-1] == dir and f.upper().startswith('D') for f in filelist) 
+1

Cảm ơn bạn, mặc dù nó không chính xác những gì tôi đang tìm kiếm, nhưng đó là một câu trả lời hay. Thanx;) – AliBZ

+1

Không, bạn không phải thực hiện thủ công. Bạn có thể chỉ cần gọi phương thức 'makedirs' trong gói' ftputil' thay thế. – xApple

4

Tôi đã thử thêm điều này làm nhận xét cho câu trả lời của @Alex L, nhưng nó quá dài. Bạn cần phải đi xuống đệ quy khi thay đổi thư mục nếu bạn muốn tạo thư mục trên đường đi. Ví dụ.

def chdir(ftp, directory): 
    ch_dir_rec(ftp,directory.split('/')) 

# Check if directory exists (in current location) 
def directory_exists(ftp, directory): 
    filelist = [] 
    ftp.retrlines('LIST',filelist.append) 
    for f in filelist: 
     if f.split()[-1] == directory and f.upper().startswith('D'): 
      return True 
    return False 

def ch_dir_rec(ftp, descending_path_split): 
    if len(descending_path_split) == 0: 
     return 

    next_level_directory = descending_path_split.pop(0) 

    if not directory_exists(ftp,next_level_directory): 
     ftp.mkd(next_level_directory) 
    ftp.cwd(next_level_directory) 
    ch_dir_rec(ftp,descending_path_split) 
6

Tôi biết đó là loại bài đăng cũ nhưng tôi chỉ cần điều này và đã đưa ra một chức năng rất đơn giản. Tôi mới sử dụng Python nên tôi đánh giá cao mọi phản hồi. Ví dụ

from ftplib import FTP 

ftp = FTP('domain.com', 'username', 'password') 

def cdTree(currentDir): 
    if currentDir != "": 
     try: 
      ftp.cwd(currentDir) 
     except IOError: 
      cdTree("/".join(currentDir.split("/")[:-1])) 
      ftp.mkd(currentDir) 
      ftp.cwd(currentDir) 

Cách sử dụng:

cdTree("/this/is/an/example") 
+2

rất đẹp! 'dir' là một python được xây dựng trong bạn có thể muốn thay đổi tên biến đó ... bạn cũng muốn nắm bắt các ngoại lệ cụ thể, không phải tất cả chúng là – xApple

+0

Cảm ơn bạn xApple cho phản hồi của bạn. Tôi thay thế 'dir' và bị giới hạn để chỉ bắt ngoại lệ IOError. – lecnt

+0

Tôi nghĩ rằng bạn quên thay thế một thể hiện của biến 'dir'. – xApple

0

Mã này sẽ tạo ra tất cả các thư mục mất tích trong đường dẫn:

... 

def chdir(ftp_path, ftp_conn): 
    dirs = [d for d in ftp_path.split('/') if d != ''] 
    for p in dirs: 
     print(p) 
     check_dir(p, ftp_conn) 


def check_dir(dir, ftp_conn): 
    filelist = [] 
    ftp_conn.retrlines('LIST', filelist.append) 
    found = False 

    for f in filelist: 
     if f.split()[-1] == dir and f.lower().startswith('d'): 
      found = True 

    if not found: 
     ftp_conn.mkd(dir) 
    ftp_conn.cwd(dir) 

if __name__ == '__main__': 
    ftp_conn = ... # ftp connection 
    t = 'FTP/for_Vadim/1/2/3/' 

    chdir(t, ftp_conn) 

Mã này sẽ rà soát tất cả dirs trong đường dẫn và tạo thiếu dirs

trước "FTP/for_Vadim /" sau "FTP/for_Vadim/1/2/3 /"

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