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

问题描述 投票:0回答:3

上周我们的测量设备供应商更新了固件。 我在这里总是使用 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)

我尝试了各种方法让它接受整个名字,但我被卡住了。而且一无所获。

关于如何解决这个问题有什么建议吗?

python ftp python-2.x ftplib
3个回答
0
投票

您没有提供我所要求的信息。无论如何,根据我们掌握的信息:

您的 FTP 服务器似乎已损坏,它返回完整的目录列表,包括

NLST
响应中的元数据。这违反了 FTP 规范。我不认为你的代码有什么问题。您必须通过从
NLST
响应中删除元数据来解决该错误。

f = f.split()[-1]

0
投票

我一生中从未使用过 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!!')

0
投票

在尝试使用 ftplib 库访问 FTP 服务器上名称中包含空格的文件夹时,我遇到了问题。该模块抛出错误,指出找不到该文件夹。

为了解决这个问题,我找到了一个简单的解决方案:我没有直接在 ftp.cwd() 命令中传递带有空格的路径,而是将完整路径存储在一个变量中,并将该变量作为参数传递给 cwd() 命令。这解决了问题,我能够正确访问该文件夹。

这是我用来实现该解决方案的代码:

from ftplib import FTP

ftp = FTP('*******')
ftp.login(user='***', passwd='***')

remote_path = '/***/****/**** ****/***/202001'

try:
    ftp.cwd(remote_path)
    
    files = ftp.nlst()
    print(files)

except Exception as e:
    print(f"Error: {e}")

ftp.quit()
print("FTP connection closed.")
© www.soinside.com 2019 - 2024. All rights reserved.