基于文件名

时间:2015-08-11 15:13:20

标签: python python-3.x ftp

使用Python 3.4

我生成的文件看起来像' Report_XXXXXX.xlsx' X是唯一的客户编号。我有一个服务器,其文件夹名为' XXXXXX.CustomerName'。我试图遍历每个文件/报告,并根据客户号将其上传到匹配的文件夹。我有一些在我的小测试环境中工作的东西,但我认为它不是我想要的工作。它上传文件,但我试图抓住任何时候它没有找到匹配。目前它的每个文件的IF语句都失败了。我想我循环太多次或错误的项目。

import os
import ftplib

creds = [line.rstrip('\n') for line in open('C:\\folder\\credentials.txt')]
ftp = ftplib.FTP_TLS("server.com")
ftp.login(creds[0], creds[1])
ftp.prot_p()
src_dir = 'C:\\Reports\\'
src_files = os.listdir('C:\\Reports\\')

for folder_name in ftp.nlst():
    for file_name in src_files:
       if folder_name[0:6] == file_name[7:-5]:
            ftp.cwd('/'+folder_name)
            open_file = open(src_dir+file_name, 'rb')
            ftp.storbinary('STOR '+file_name, open_file)
            open_file.close()
       else:
        print('Folder ' + folder_name + ' Not Found')
ftp.quit()

例如,源目录有3个文件:' Report_100002.xlsx,Report_100003.xlsx,Report_100007.xlsx'并且服务器具有匹配的文件夹和一些额外的文件夹。上传文件,输出如下:

Folder 100000.CustomerName Not Found
Folder 100000.CustomerName Not Found
Folder 100000.CustomerName Not Found
Folder 100002.CustomerName Not Found
Folder 100002.CustomerName Not Found
Folder 100003.CustomerName Not Found
Folder 100003.CustomerName Not Found
Folder 100007.CustomerName Not Found
Folder 100007.CustomerName Not Found

我正试图进入一个状态,我可以正确记录每个项目,是否成功,它登陆的文件夹等等......

1 个答案:

答案 0 :(得分:1)

在内部for循环中,您将src_dir中的所有3个文件名与folder_name进行比较,但最多只有一个满足if语句中的条件。因此,对于ftp服务器上的每个文件夹,其他不匹配的2或3个文件会导致您看到的输出。您可以使用标记来跟踪是否找到匹配项并根据该标记打印输出。

另一件事是您应该开始迭代src_files,然后通过迭代ftp.nlist()找到匹配的文件夹名称(您对没有匹配文件夹的源文件感兴趣,而不是其他方式)。所以这样的事情(假设源文件允许在多个文件夹中结束):

....
folder_names = ftp.nlst()
for file_name in src_files:
    folder_found = False
    for folder_name in folder_names:
        if folder_name[0:6] == file_name[7:-5]:
            folder_found = True
            ftp.cwd('/'+folder_name)
            open_file = open(src_dir+file_name, 'rb')
            ftp.storbinary('STOR '+file_name, open_file)
            open_file.close()
    if not folder_found:   
        print('No destination folder found for ' + file_name)
ftp.quit()

folder_names = ftp.nlst()就在那里,所以你不要重复列出服务器上的目录)

相关问题