python - 根据文件名通过 FTP 上传多个文件

标签 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

我正在尝试达到一种可以正确记录每个项目以及它是否成功、它位于哪个文件夹等的状态...

最佳答案

在你的内心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() 就在那里,这样您就不必重复列出服务器上的目录)

关于python - 根据文件名通过 FTP 上传多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31945617/

相关文章:

Python: "as"关键字简写

java - 如何使用 JPype 在 Python 中导入用户构建的 jar?

python - 从 python 执行 R 脚本

python - 如何将列表拆分为元组

python - 如何使用封闭类的类型键入提示方法?

java - FtpOutputStream 或标准 Java 中的类似内容

Java 8 vs Python 2.7 pbkdf2 哈希 - 不同的输出哈希字母大小写

python-3.x - 输入大小(输入深度)必须可通过形状推断访问,但在尝试将 tf.expand_dims 轴设置为 0 时看到值 None 错误

python - 使用 Python 3 的 FTP 文本文件为空

python - 如何在 Windows 中安装 python ftplib?