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