文件名中包含空格的 Python FTP 下载文件



上周,我们的测量设备供应商更新了固件。 我在这里总是使用 python 脚本来下载所有.rd文件。

正式固件返回的文件名总是像191222_221400.rd一个完整的文件名。

不幸的是,更新后固件将其恢复为"rw group owner oct 9_191222_221400.rd"

脚本现在停止写入的位置。然后不删除它。

## Handles to download and delete the .rd file in the project folder
def downloadAndDelet_RD(self):
time.sleep(5)
files = []
#print self.conf.INSipAddress
ftp = ftplib.FTP(self.conf.INSipAddress)
ftp.login()
files =  ftp.nlst()
for f in files:
if f.endswith(".rd"):
#print self.conf.newP + '//'  + self.conf.nativefolderName + '//' +self.gpsSelectedProject+"//"+f
ftpfile = urllib2.urlopen("ftp://"+self.conf.INSipAddress +"//"+f)
localfile = open(self.conf.newP + '//'  + self.conf.nativefolderName + '//' +self.gpsSelectedProject+"//"+f, "wb")        
ftp.retrbinary('RETR %s' % f, localfile.write)
localfile.close()
if self.conf.INSDeleteRD == 1:
ftp.delete(f)

我已经尝试了各种事情来让它接受整个名字,但我被卡住了。而且一事无成。

关于如何解决此问题的任何建议?

你没有提供我要求的信息。无论如何,基于我们所拥有的内涵:

您的 FTP 服务器似乎已损坏,它会返回完整的目录列表,包括NLST响应中的元数据。这违反了 FTP 规范。我认为你的代码没有任何问题。您必须通过从NLST响应中删除元数据来解决该错误。

f = f.split()[-1]

我一生中从未使用过Python 2x。 我进入游戏有点晚,所以我一直使用 Python 3x。 下面的脚本在 Python 3x 中对我来说效果很好。

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!!')

最新更新