遍历FTP目录中的所有文件夹

时间:2018-12-26 22:30:37

标签: python python-3.x

我在线找到了一些代码,并对其进行了修改,以列出FTP目录中的所有文件夹。我列出了所有文件夹,下面是代码。

import ftplib
from ftplib import FTP
ftp = FTP()
import datetime


filenames = []
data = []

ftp = ftplib.FTP('ftp.something.com', 'u_name', 'pswd')  

def get_dirs_ftp(folder=""):
    contents = ftp.nlst(folder)
    folders = []
    for item in contents:
        if "." not in item:
            folders.append(item)
    return folders
def get_all_dirs_ftp(folder=""):
    dirs = []
    new_dirs = []
    new_dirs = get_dirs_ftp(folder)
    while len(new_dirs) > 0:
        for dir in new_dirs:
            dirs.append(dir)

        old_dirs = new_dirs[:]
        new_dirs = []
        for dir in old_dirs:
            for new_dir in get_dirs_ftp(dir):
                new_dirs.append(new_dir)
    dirs.sort()
    return dirs

allfiles = []
all_dirs = get_all_dirs_ftp()

使用上面的代码,我确认层次结构正确。现在,我试图遍历此文件夹和子文件夹列表,并深入研究每个文件夹和子文件夹中的文件。这是发生问题的地方。这是我其余的代码。

for dir in all_dirs:
    ftp.cwd(dir)
    ftp.retrlines('LIST')  

    filenames = []  
    ftp.retrlines('NLST', filenames.append) 

    # writes file name and modified date and file size, to dataframe
    #data = []
    for filename in filenames:  
        filename
        modifiedTimeFtp = datetime.datetime.strptime(datetime[4:], "%Y%m%d%H%M%S").strftime("%d %b %Y %H:%M:%S")
        size = ftp.size(filename)
        filesize = "{:.2f}".format(size/(1024)) + 'kb'
        finaldata = (str(filename) + '|' + str(modifiedTimeFtp) + '|' + str(filesize))
        allfiles.append(finaldata,'\n')

现在,当我运行这段代码时,出现以下错误:TypeError: 'module' object is not subscriptable

我认为问题出在这个范围内。

ftp.cwd(dir)
ftp.retrlines('LIST')  

filenames = []  
ftp.retrlines('NLST', filenames.append) 

这是我的猜测,但我不确定。有一种简单的方法可以使它正常工作吗?我几乎觉得这是不可能完成的任务,因为我正在查询的FTP文件夹很大,而且我猜测在任务运行时可能存在各种超时或其他任何超时。我要做的就是获取文件名,修改日期/时间和文件大小。谢谢你的表情。

2 个答案:

答案 0 :(得分:0)

您应该查看引起错误的实际行的堆栈跟踪。

在您的代码中,错误似乎是此行:

    modifiedTimeFtp = datetime.datetime.strptime(datetime[4:], "%Y%m%d%H%M%S").strftime("%d %b %Y %H:%M:%S")

datetime似乎是模块,但是您可能想用日期引用某个变量,所以datetime[4:]会导致错误。

答案 1 :(得分:0)

这是最终的有效版本。

import ftplib
from ftplib import FTP
ftp = FTP()
from datetime import datetime


filenames = []
data = []

ftp = ftplib.FTP('ftp.anything.com', 'u_name', 'ps_wd')  


def get_dirs_ftp(folder=""):
    contents = ftp.nlst(folder)
    folders = []
    for item in contents:
        if "." not in item:
            folders.append(item)
    return folders
def get_all_dirs_ftp(folder=""):
    dirs = []
    new_dirs = []
    new_dirs = get_dirs_ftp(folder)
    while len(new_dirs) > 0:
        for dir in new_dirs:
            dirs.append(dir)

        old_dirs = new_dirs[:]
        new_dirs = []
        for dir in old_dirs:
            for new_dir in get_dirs_ftp(dir):
                new_dirs.append(new_dir)
    dirs.sort()
    return dirs

#allfiles = []
# get parent and child folders in directory
all_dirs = get_all_dirs_ftp()

# create a list to append metadata
dir_list = []

for dir in all_dirs:
    ftp.cwd('/'+dir+'/')
    print(dir)
    dir_list.append(dir)
    ftp.dir(dir_list.append)

    len(dir_list)


# you probably want to dump the results to a file...
outF = open('C:/your_path/filenames.csv', 'w')
for line in dir_list:
  # write line to output file
  outF.write(line)
  outF.write("\n")
outF.close()
print('Done!!')