使用ftplib访问FTP URL

问题描述

我在Windows中将ftplib与python结合使用,以访问ftp5.xyz.eu上的文件夹。

在ftp5.xyz.eu中,文件夹“ foo bar”中的文件夹为“ baz”。因此:ftp5.xyz.eu/foo bar / baz

我在ftp5.xyz.eu上成功连接,但是当我将整个路径写入文件夹时,它给了我一个错误

from ftplib import FTP

#domain name or server ip:
ftp = FTP('ftp5.xyz.eu/foo%20bar')
...
ftp.dir()

以下错误

  File "C:\Users\mirel.voicu\AppData\Local\Programs\Python\python37\lib\ftplib.py",line 117,in __init__
    self.connect(host)
  File "C:\Users\mirel.voicu\AppData\Local\Programs\Python\python37\lib\ftplib.py",line 152,in connect
    source_address=self.source_address)
  File "C:\Users\mirel.voicu\AppData\Local\Programs\Python\python37\lib\socket.py",line 707,in create_connection
    for res in getaddrinfo(host,port,SOCK_STREAM):
  File "C:\Users\mirel.voicu\AppData\Local\Programs\Python\python37\lib\socket.py",line 748,in getaddrinfo
    for res in _socket.getaddrinfo(host,family,type,proto,flags):
socket.gaierror: [Errno 11001] getaddrinfo Failed

解决方法

这与空格无关。 FTP constructor的第一个参数是host –一个主机名或一个 IP地址 –不是一个 URL 。>

所以应该是:

ftp = FTP('ftp5.xyz.eu')

如果要列出foo bar子文件夹中的文件,请执行以下操作:

ftp.cwd('foo bar')      
ftp.dir()

ftp.dir('foo bar')
,

该错误消息是Python稍显晦涩的说法,即“没有服务器使用该名称”;实际上,这里的服务器名称无效。您正在传递'ftp5.xyz.eu/foo%20bar',而您应该只传递'ftp5.xyz.eu'

FTP传统上不使用URL地址,而Python的ftplib不支持解析它们。您需要使用哦,我猜urllib来分隔URL,然后从那里获取。

from ftplib import FTP
from urllib.parse import urlparse

parsed = urlparse('ftp://ftp5.xyz.eu/foo%20bar')
ftp = FTP(parsed.netloc)
ftp.login()
ftp.cwd(parsed.path)
ftp.dir()

已解析的parsed.path仍使用%20,其中FTP服务器可能需要文字空间;也许也可以进行URL解码(urllib.parse.unquoteurlllib.parse.unquote_plus)。