【问题标题】:Uploading multiple files via FTP based on filename根据文件名通过 FTP 上传多个文件
【发布时间】:2015-08-12 22:17:37
【问题描述】:

使用 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

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

【问题讨论】:

  • 为什么是ftpdir = ftp.nlst(),然后是for folder_name in ftp.nlst()?做两次似乎很愚蠢......使用一个或另一个
  • heinst - 抱歉,我稍后打印它以查看结果,所以我将其删除
  • 显示print(ftp.nlst())print(src_files)

标签: python python-3.x ftp


【解决方案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() 在那里,因此您不会重复列出服务器上的目录)

【讨论】:

  • 这是我想要的工作方式,谢谢!我唯一意识到的是“错误”消息比 print('Folder ' + file_name[7:-5] + 'Not Found') 更有帮助。再次感谢
猜你喜欢
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 2012-04-26
  • 2013-03-24
  • 1970-01-01
  • 2013-09-26
  • 2018-01-05
相关资源
最近更新 更多