Python 运行FTP.retrbinary检索文件时出错
我正在使用pythons ftplib尝试从远程服务器检索文件(实践项目)。我发送文件没有问题,但在尝试检索时出错。我正在使用python 3。这是我的代码:Python 运行FTP.retrbinary检索文件时出错,python,ftp,ftplib,Python,Ftp,Ftplib,我正在使用pythons ftplib尝试从远程服务器检索文件(实践项目)。我发送文件没有问题,但在尝试检索时出错。我正在使用python 3。这是我的代码: from ftplib import FTP user = 'myusername' passw = 'mypassw' url = input('FTP url: ').lower().strip() ftp = FTP(url) #connect to the host, default port ftp.login(us
from ftplib import FTP
user = 'myusername'
passw = 'mypassw'
url = input('FTP url: ').lower().strip()
ftp = FTP(url) #connect to the host, default port
ftp.login(user, passw) # enters login info
def getfile():
ftp.retrlines('LIST') # List directory contents
filename = input('Name of file: ')
localfile = open(filename, 'wb')
ftp.retrbinary('RETR' + filename, localfile.write, 1024)
localfile.close()
getfile()
这是我得到的错误:
Traceback (most recent call last):
File "C:\Users\User\Desktop\School\python\ftpget.py", line 16, in <module>
getfile()
File "C:\Users\User\Desktop\School\python\ftpget.py", line 13, in getfile
ftp.retrbinary('RETR' + filename, localfile.write, 1024)
File "C:\Python34\lib\ftplib.py", line 441, in retrbinary
with self.transfercmd(cmd, rest) as conn:
File "C:\Python34\lib\ftplib.py", line 398, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "C:\Python34\lib\ftplib.py", line 364, in ntransfercmd
resp = self.sendcmd(cmd)
File "C:\Python34\lib\ftplib.py", line 272, in sendcmd
return self.getresp()
File "C:\Python34\lib\ftplib.py", line 245, in getresp
raise error_perm(resp)
ftplib.error_perm: 500 ?
回溯(最近一次呼叫最后一次):
文件“C:\Users\User\Desktop\School\python\ftpget.py”,第16行,在
getfile()
文件“C:\Users\User\Desktop\School\python\ftpget.py”,第13行,在getfile中
ftp.retrbinary('RETR'+文件名,localfile.write,1024)
文件“C:\Python34\lib\ftplib.py”,第441行,在retrbinary中
使用self.transfercmd(cmd,rest)作为连接:
文件“C:\Python34\lib\ftplib.py”,第398行,在transfercmd中
返回self.ntransfercmd(cmd,rest)[0]
文件“C:\Python34\lib\ftplib.py”,第364行,在ntransfercmd中
resp=self.sendcmd(cmd)
文件“C:\Python34\lib\ftplib.py”,第272行,在sendcmd中
返回self.getresp()
文件“C:\Python34\lib\ftplib.py”,第245行,在getresp中
升起错误\u perm(resp)
ftplib.error\u perm:500?
知道是什么导致了错误吗?
ftplib
如果响应的状态代码以“5”开头,则会引发错误。这意味着服务器返回5xx错误:
0.5.1500内部服务器错误
服务器遇到意外情况,无法正常运行
满足要求
Note: Note to implementors: some deployed proxies are known to
return 400 or 500 when DNS lookups time out.
10.5.2501未实施
服务器不支持实现所需的功能
要求当服务器没有响应时,这是适当的响应
识别请求方法,但无法为其提供支持
任何资源
10.5.3502坏网关
服务器在充当网关或代理时接收到无效的
来自它在尝试实现时访问的上游服务器的响应
请求
Note: Note to implementors: some deployed proxies are known to
return 400 or 500 when DNS lookups time out.
10.5.4503服务不可用
由于发生错误,服务器当前无法处理该请求
服务器的临时过载或维护。这意味着
这是一种暂时的情况,经过一段时间后会得到缓解
延迟如果已知,延迟的长度可以用
在标头之后重试。如果没有在之后重试,客户端应该
像处理500响应一样处理响应
Note: The existence of the 503 status code does not imply that a
server must use it when becoming overloaded. Some servers may wish
to simply refuse the connection.
10.5.5网关超时
服务器在充当网关或代理时,未收到
URI指定的上游服务器的及时响应(例如。
HTTP、FTP、LDAP)或它需要的其他辅助服务器(如DNS)
在尝试完成请求时访问
Note: Note to implementors: some deployed proxies are known to
return 400 or 500 when DNS lookups time out.
10.5.6不支持HTTP版本
服务器不支持或拒绝支持HTTP协议
请求消息中使用的版本。服务器正在指示
无法或不愿意使用相同的方法完成请求
作为客户的主要版本,如第3.1节所述,不包括
显示此错误消息。响应应该包含一个实体
描述不支持该版本的原因以及其他哪些协议
由该服务器支持
根据报告:
FTP.retrbinary(命令,回调[,maxblocksize[,rest]])取回 文件以二进制传输模式传输。命令应该是适当的RETR 命令:“RETR filename” 但你写的是:
ftp.retrbinary('RETR' + filename, localfile.write, 1024)
这将产生如下结果:
ftp.retrbinary('RETRdog.jpg', localfile.write, 1024)
您需要在“RETR”之后添加一个空格
使用python创建您自己的ftp服务器
顺便说一下,您可以编写一个简短的python程序,用作ftp服务器。首先安装模块pyftpdlib
:
$ pip3.4 install pyftpdlib #See note on 3.4 below
如果您的系统上只有一个python版本,您可以编写:
$ pip install pyftpdlib
如果您的计算机上有多个python版本,请将正确的版本号替换为3.4。您指定的版本号是pyftpdlib模块将安装的python版本
以下是python中ftp服务器的外观:
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
my_authorizer = DummyAuthorizer()
my_authorizer.add_user(
username = '7stud',
password = '1234',
homedir = '.',
perm='elrw' #permissions: 'e'->change dir, 'l'->list files, 'r'->retrieve files, 'w'->store a file to the server
)
my_handler = FTPHandler
my_handler.authorizer = my_authorizer
port = 2121
my_handler.banner = "You connected to my ftp server on port: {}".format(port)
address = ('localhost', port)
server = FTPServer(address, my_handler)
server.max_cons = 256
server.max_cons_per_ip = 5
server.serve_forever()
pyftpdlib
文档和教程。
添加用户()
和描述的权限
然后,您可以为服务器创建目录:
$ mkdir ftp_server
$ cd ftp_server
$ touch my_ftp_server.py
将上面的代码放入文件my\u ftp\u server.py
。然后将一些文件添加到ftp_服务器目录,以便练习“下载”。然后通过运行my_ftp_server.py启动服务器
在另一个终端窗口中,将目录切换到包含python程序的目录:
$ cd python_programs
然后对ftp客户端程序进行一些小更改:
from ftplib import FTP
def getfile(conn): #It's good practice not to refer to global variables in your functions.
#Instead, pass in any values your function needs as arguments.
conn.retrlines('LIST') # List directory contents
filename = input('Name of file: ')
localfile = open(filename, 'wb')
ftp_command = 'RETR {}'.format(filename)
conn.retrbinary(ftp_command, localfile.write, 1024)
localfile.close()
user = '7stud'
passw = '1234'
port = 2121
url = input('FTP url: ').lower().strip()
ftp = FTP()
ftp.connect(url, port)
ftp.login(user, passw)
getfile(ftp)
ftp.quit()
~/python_programs$ python3.4 ftp_client.py
FTP url: localhost
drwxr-xr-x 4 7stud staff 136 Feb 11 09:07 cgi-bin
-rw-r--r-- 1 7stud staff 3446 Jun 08 2013 client_socket.py
-rw-r--r-- 1 7stud staff 680 Feb 15 03:03 ftp_server.py
-rw-r--r-- 1 7stud staff 721 Feb 12 03:01 http_server.py
-rw-r--r-- 1 7stud staff 498 Jan 01 07:10 index.html
-rw-r--r-- 1 7stud staff 68 Jan 01 05:03 oneliner.py
-rw-r--r-- 1 7stud staff 954 Feb 11 09:05 socket_server.py
-rw-r--r-- 1 7stud staff 0 Feb 15 02:50 test.png
Name of file: test.png
~/python_programs$ ls *.png
bar_freq.png example.png test.png
~/python_programs$
以下是ftp客户端程序的运行示例:
from ftplib import FTP
def getfile(conn): #It's good practice not to refer to global variables in your functions.
#Instead, pass in any values your function needs as arguments.
conn.retrlines('LIST') # List directory contents
filename = input('Name of file: ')
localfile = open(filename, 'wb')
ftp_command = 'RETR {}'.format(filename)
conn.retrbinary(ftp_command, localfile.write, 1024)
localfile.close()
user = '7stud'
passw = '1234'
port = 2121
url = input('FTP url: ').lower().strip()
ftp = FTP()
ftp.connect(url, port)
ftp.login(user, passw)
getfile(ftp)
ftp.quit()
~/python_programs$ python3.4 ftp_client.py
FTP url: localhost
drwxr-xr-x 4 7stud staff 136 Feb 11 09:07 cgi-bin
-rw-r--r-- 1 7stud staff 3446 Jun 08 2013 client_socket.py
-rw-r--r-- 1 7stud staff 680 Feb 15 03:03 ftp_server.py
-rw-r--r-- 1 7stud staff 721 Feb 12 03:01 http_server.py
-rw-r--r-- 1 7stud staff 498 Jan 01 07:10 index.html
-rw-r--r-- 1 7stud staff 68 Jan 01 05:03 oneliner.py
-rw-r--r-- 1 7stud staff 954 Feb 11 09:05 socket_server.py
-rw-r--r-- 1 7stud staff 0 Feb 15 02:50 test.png
Name of file: test.png
~/python_programs$ ls *.png
bar_freq.png example.png test.png
~/python_programs$
好了,就这样。谢谢我想我真的需要更加注意我的语法。总是简单的事情。再次感谢@马龙,不客气!有一种更好的方法来构造字符串:
ftp\u cmd=“RETR{}”.format(filename)
然后ftp.retrbinary(ftp\u cmd,localfile.write,1024)
。请参见此处的format()示例:。您还可以为ftp服务器使用python程序。在我的文章的结尾看到如何。太棒了,谢谢你提供关于创建ftp服务器的更多信息,我猜这是我的下一个项目!