我有以下代码,可以轻松连接到FTP服务器并打开一个zip文件.我想将该文件下载到本地系统.怎么做?
# Open the file for writing in binary mode
print 'Opening local file ' + filename
file = open(filename, 'wb')
# Download the file a chunk at a time
# Each chunk is sent to handleDownload
# We append the chunk to the file and then print a '.' for progress
# RETR is an FTP command
print 'Getting ' + filename
ftp.retrbinary('RETR ' + filename, handleDownload)
# Clean up time
print 'Closing file ' + filename
file.close()
Run Code Online (Sandbox Code Playgroud) 我创建了一个PHP脚本来更新本地目录中的实时Web服务器.我正在将脚本迁移到Python中.它在大多数情况下工作正常,但在PUT命令之后,文件的大小似乎会改变.因此,文件的大小与服务器上的文件大小不同.
一旦我从FTP服务器再次下载文件,唯一的区别是CR/LF标记.这让我很烦,因为相同的脚本正在比较要更新的文件的大小.此外,如果它意味着什么,该脚本在PHPvíaftp_put中完美运行.
from ftplib import FTP
ftpserver = "myserver"
ftpuser = "myuser"
ftppass = "mypwd"
locfile = "g:/test/style.css"
ftpfile = "/temp/style.css"
try:
ftp = FTP(ftpserver, ftpuser, ftppass)
except:
exit ("Cannot connect")
f = open (locfile, "r")
try:
ftp.delete (ftpfile)
except:
pass
# ftp.sendcmd ("TYPE I")
# ftp.storlines("STOR %s" % ftpfile, f)
ftp.storbinary("STOR %s" % ftpfile, f)
f.close()
ftp.dir (ftpfile)
ftp.quit()
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我试图使用Python的ftplib读取文件而不编写它们.大致相当于:
def get_page(url):
try:
return urllib.urlopen(url).read()
except:
return ""
Run Code Online (Sandbox Code Playgroud)
但使用FTP.
我试过了:
def get_page(path):
try:
ftp = FTP('ftp.site.com', 'anonymous', 'passwd')
return ftp.retrbinary('RETR '+path, open('page').read())
except:
return ''
Run Code Online (Sandbox Code Playgroud)
但这不起作用.文档中的唯一示例涉及使用该ftp.retrbinary('RETR README', open('README', 'wb').write)格式编写文件.是否可以在不先写入的情况下读取ftp文件?
Python newb在这里请耐心等待.我正在整理一个脚本,通过FTP下载目录中的所有文件.到目前为止,我已经设法连接并获取一个文件,但我似乎无法批量工作(从目录中获取所有文件)这是我到目前为止:
from ftplib import FTP
import os, sys, os.path
def handleDownload(block):
file.write(block)
print ".",
ddir='C:\\Data\\test\\'
os.chdir(ddir)
ftp = FTP('test1/server/')
print 'Logging in.'
ftp.login('user1\\anon', 'pswrd20')
directory = '\\data\\test\\'
print 'Changing to ' + directory
ftp.cwd(directory)
ftp.retrlines('LIST')
print 'Accessing files'
for subdir, dirs, files in os.walk(directory):
for file in files:
full_fname = os.path.join(root, fname);
print 'Opening local file '
ftp.retrbinary('RETR C:\\Data\\test\\' + fname,
handleDownload,
open(full_fname, 'wb'));
print 'Closing file ' + filename
file.close();
ftp.close()
Run Code Online (Sandbox Code Playgroud)
我打赌你可以告诉我,当我运行它时它没有做太多,所以任何改进建议都将非常感激
PS这不是作业:DD
谢谢!!
我想用Python的ftplib客户端(而不是默认端口21)指定端口.
这是代码:
from ftplib import FTP
ftp = FTP('localhost') # connect to host, default port
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来指定替代端口?
我正在尝试遍历本地计算机上的文件夹中的一组文件,并使用此代码(Python 3.6.1 32位,Windows 10 64位)仅将文件名包含"Service_Areas"的文件上载到我的FTP站点):
ftp = FTP('ftp.ftpsite.org')
username = ('username')
password = ('password')
ftp.login(username,password)
ftp.cwd(username.upper())
ftp.cwd('2017_05_02')
for i in os.listdir('C:\FTP_testing'):
if i.startswith("Service_Area"):
local_path = os.path.join('C:\FTP_testing',i)
file = open(local_path,'rb')
ftp.storbinary("STOR " + i, open(file, 'rb'))
file.close()
continue
else:
print('nope')
ftp.quit()
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误:
Traceback (most recent call last):
File "C:\Users\user\Desktop\Test1.py", line 32, in <module>
ftp.storbinary("STOR " + str(i), open(file, 'rb'))
TypeError: expected str, bytes or os.PathLike object, not _io.BufferedReader
Run Code Online (Sandbox Code Playgroud)
有什么建议?
如何使用ftplib检查远程ftp上的文件是否是文件夹?
我现在最好的方法是做一个nlst,并遍历每个文件的调用大小,如果文件出错那么它是一个文件夹?
有没有更好的办法?我无法解析列表的输出,因为有大约十几个不同的ftp服务器(很多很老.)
我该怎么办?
我开发了一个应用程序,它本质上只是一个小的ftp服务器,能够指定您希望在启动时共享的目录.我正在使用ftplib作为服务器,因为它很容易生病.我唯一的问题是,如果你在路由器后面,你必须手动转发路由器上的端口,我发现它对我的用户(又名同事/客户端)来说有点太复杂了.
所以我一直在寻找一个开放端口的简单解决方案,但我发现大多数API太宽泛而且超出我的想象.有人知道一个相对简单的解决方案吗?
注意:它实际上只会在Windows上使用,尽管欢迎跨平台兼容性.如果有一个更简单的Windows解决方案,那么我会选择它.
谢谢!
我需要连接到能够使用lftp成功连接的FTPS服务器.但是,当我尝试使用Python ftplib.FTP_TLS时,它会超时,堆栈跟踪显示它正在等待服务器发送欢迎消息等.有谁知道问题是什么以及如何克服?我想知道是否需要在服务器端进行某些操作,但是lftp客户端如何正常工作.任何帮助是极大的赞赏.
这是堆栈跟踪:
ftp = ftplib.FTP_TLS()
ftp.connect(cfg.HOST, cfg.PORT, timeout=60)
File "C:\Users\username\Softwares\Python27\lib\ftplib.py", line 135, in connect
self.welcome = self.getresp()
File "C:\Users\username\Softwares\Python27\lib\ftplib.py", line 210, in getresp
resp = self.getmultiline()
File "C:\Users\username\Softwares\Python27\lib\ftplib.py", line 196, in getmultiline
line = self.getline()
File "C:\Users\username\Softwares\Python27\lib\ftplib.py", line 183, in getline
line = self.file.readline()
File "C:\Users\username\Softwares\Python27\lib\socket.py", line 447, in readline
data = self._sock.recv(self._rbufsize)
socket.timeout: timed out
Run Code Online (Sandbox Code Playgroud)
使用lftp成功登录到同一个ftps服务器:
$ lftp
lftp :~> open ftps://ip_address:990
lftp ip_address:~> set ftps:initial-prot P
lftp ip_address:~> login ftps_user_id ftps_user_passwd
lftp sftp_user_id@ip_address:~> ls
ls: Fatal error: …Run Code Online (Sandbox Code Playgroud) 我必须使用Python脚本自动将文件夹上传到FTP.我可以上传单个文件,但不能上传包含子文件夹和文件的文件夹.我做了很多搜索,但都失败了.有人可以帮助我吗?提前致谢.
#! /usr/bin/python
import ftplib
s = ftplib.FTP('serverip','usrname','password')
file = '/home/rock/test.txt'
ftppath = '/IT'
filename = "rak"
s.cwd(ftppath)
f = open(file,'rb')
s.storbinary('STOR ' + filename, f)
f.close()
s.quit()
Run Code Online (Sandbox Code Playgroud)