Python ftp下载和归档
我一直在尝试用python编写代码,对ftp的主目录进行分级,并将其归档到本地pc中。我不是一个业余程序员,python对我来说是相当新的。 我现在得到的错误是Python ftp下载和归档,python,ftp,Python,Ftp,我一直在尝试用python编写代码,对ftp的主目录进行分级,并将其归档到本地pc中。我不是一个业余程序员,python对我来说是相当新的。 我现在得到的错误是 File "C:\Users\Ali\Desktop\ftp_archiving_script.py", line 24, in <module> ftpDownload = ftp.retrbinary('RETR', filename) 有人能在这个问题上给我指点一下吗 谢谢, 更新 try: for file
File "C:\Users\Ali\Desktop\ftp_archiving_script.py", line 24, in <module>
ftpDownload = ftp.retrbinary('RETR', filename)
有人能在这个问题上给我指点一下吗
谢谢,
更新
try:
for filename in filenames:
with io.StringIO() as fObject:
ftp.retrbinary('RETR %s' %filename, fObject.write)
with ZipFile(os.path.join('C:\\','DC_archive.zip'), 'w') as myzip:
myzip.write(fObject, compress_type=compression)
myzip.close()
更新了@fals的回溯。。。此外,这是使用下面的代码,而不是我在顶部的代码
Traceback (most recent call last):
File "C:\Users\Ali\Desktop\ftp_archive2.py", line 20, in <module>
ftpDownload = ftp.retrbinary('RETR ' + filename, f.write)
File "C:\Python33\lib\ftplib.py", line 424, in retrbinary
with self.transfercmd(cmd, rest) as conn:
File "C:\Python33\lib\ftplib.py", line 386, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "C:\Python33\lib\ftplib.py", line 352, in ntransfercmd
resp = self.sendcmd(cmd)
File "C:\Python33\lib\ftplib.py", line 259, in sendcmd
return self.getresp()
File "C:\Python33\lib\ftplib.py", line 233, in getresp
raise error_perm(resp)
ftplib.error_perm: 550 File not found
回溯(最近一次呼叫最后一次):
文件“C:\Users\Ali\Desktop\ftp\u archive2.py”,第20行,在
ftpDownload=ftp.retrbinary('RETR'+文件名,f.write)
文件“C:\Python33\lib\ftplib.py”,第424行,在retrbinary中
使用self.transfercmd(cmd,rest)作为连接:
文件“C:\Python33\lib\ftplib.py”,第386行,在transfercmd中
返回self.ntransfercmd(cmd,rest)[0]
文件“C:\Python33\lib\ftplib.py”,第352行,在ntransfercmd中
resp=self.sendcmd(cmd)
文件“C:\Python33\lib\ftplib.py”,第259行,在sendcmd中
返回self.getresp()
文件“C:\Python33\lib\ftplib.py”,第233行,在getresp中
升起错误\u perm(resp)
ftplib.error\u perm:找不到550文件
来自Python文档,用于:
FTP.retrbinary(命令,回调[,maxblocksize[,rest]])
以二进制传输模式检索文件。命令应该是一个
适当的RETR命令:“RETR文件名”。回调函数是
使用单个字符串参数为接收到的每个数据块调用
给出数据块
它不表示它返回类似于对象或字符串的文件
相反,您必须创建自己的回调来写入文件对象
with open('my-downloaded-file', 'wb') as f:
ftp.retrbinary('RETR %s' % filename, f.write)
这里,f.write
是回调函数,它将在数据从套接字到达时接收数据。如果不想使用open
将文件保存到磁盘,可以使用该模块模拟内存中的文件。尝试以下代码:
import ftplib
from io import BytesIO
import os
import zipfile
REMOTE_HOST = 'xxx.xxx.xxx'
REMOTE_USER = '...'
REMOTE_PASS = '...'
REMOTE_DIR_PATH = '//'
LOCAL_ZIP_PATH = os.path.join(os.path.expanduser('~'), 'Desktop', 'DC_archive.zip')
ftp = ftplib.FTP(REMOTE_HOST)
try:
ftp.login(REMOTE_USER, REMOTE_PASS)
ftp.cwd(REMOTE_DIR_PATH)
filenames = ftp.nlst()
with zipfile.ZipFile(LOCAL_ZIP_PATH, 'w') as zf:
for filename in filenames:
with BytesIO() as f:
try:
ftpDownload = ftp.retrbinary('RETR ' + filename, f.write)
zf.writestr(filename, f.getvalue())
except ftplib.Error as e:
print('Skip {}: {}'.format(filename, e))
finally:
ftp.quit()
谢谢你,我将尝试修复它,看看我得到了什么相同的错误。我现在就更新代码。文件“C:\Users\Ali\Desktop\ftp\u archiving\u script.py”,第23行,ftp.retrbinary('RETR%s'%filename,fObject.write')文件“C:\Users\Ali\Desktop\ftp\u archive2.py”,第17行,带zipfile.zipfile.zipfile(LOCAL_ZIP_PATH,'w')作为zf:这是我从您的代码中得到的错误。@madmanali93,显示完整回溯或回溯的最后一行。@madmanali93,我想你是为AustinPhillips发回了追踪,不是为我;)。没有
。。。zipfile.zipfile…
在您发布的回溯中。很抱歉现在让人们感到困惑XD我将发布另一个now@madmanali93,我明白了。将本地路径更改为您具有写入权限的路径。例如,LOCAL\u ZIP\u PATH=r'C:\Users\username\DC\u archive.ZIP'
import ftplib
from io import BytesIO
import os
import zipfile
REMOTE_HOST = 'xxx.xxx.xxx'
REMOTE_USER = '...'
REMOTE_PASS = '...'
REMOTE_DIR_PATH = '//'
LOCAL_ZIP_PATH = os.path.join(os.path.expanduser('~'), 'Desktop', 'DC_archive.zip')
ftp = ftplib.FTP(REMOTE_HOST)
try:
ftp.login(REMOTE_USER, REMOTE_PASS)
ftp.cwd(REMOTE_DIR_PATH)
filenames = ftp.nlst()
with zipfile.ZipFile(LOCAL_ZIP_PATH, 'w') as zf:
for filename in filenames:
with BytesIO() as f:
try:
ftpDownload = ftp.retrbinary('RETR ' + filename, f.write)
zf.writestr(filename, f.getvalue())
except ftplib.Error as e:
print('Skip {}: {}'.format(filename, e))
finally:
ftp.quit()