<p><strong>编辑2017年12月20日:</strong></p>
<p>为此,我在GitHub中编写了一个项目。<a href="https://github.com/ceylanb/NetPubPy" rel="nofollow noreferrer">Click for details!</a></p>
<hr/>
<p>上面有很好的答案,但是我还想使用<a href="http://ftputil.sschwarzer.net/trac/wiki/Documentation" rel="nofollow noreferrer">ftputil</a>包添加一个好的答案。如果需要将文件从本地目录上载到ftp目录,可以使用此递归函数:</p>
<pre><code>def upload_dir(localDir, ftpDir):
list = os.listdir(localDir)
for fname in list:
if os.path.isdir(localDir + fname):
if(ftp_host.path.exists(ftpDir + fname) != True):
ftp_host.mkdir(ftpDir + fname)
print(ftpDir + fname + " is created.")
upload_dir(localDir + fname + "/", ftpDir + fname + "/")
else:
if(ftp_host.upload_if_newer(localDir + fname, ftpDir + fname)):
print(ftpDir + fname + " is uploaded.")
else:
print(localDir + fname + " has already been uploaded.")
</code></pre>
<p>如果决定使用此函数,则必须使用ftputil包连接ftp。为此,可以使用以下代码段:</p>
<pre><code>with ftputil.FTPHost("ftp_host", "ftp_username", "ftp_password") as ftp_host:
</code></pre>
<p>所以,我们快结束了。最后一件事是对像我这样的初学者使用这个函数:</p>
<pre><code>local_dir = "D:/Projects/.../"
ftp_dir = "/.../../"
upload_dir(local_dir, ftp_dir)
</code></pre>
<p>最重要的是路径末尾的“/”字符。你得把它放在最后。最后,我想分享整个代码:</p>
<pre><code>with ftputil.FTPHost("ftp_host", "ftp_username", "ftp_password") as ftp_host:
def upload_dir(localDir, ftpDir):
list = os.listdir(localDir)
for fname in list:
if os.path.isdir(localDir + fname):
if(ftp_host.path.exists(ftpDir + fname) != True):
ftp_host.mkdir(ftpDir + fname)
print(ftpDir + fname + " is created.")
upload_dir(localDir + fname + "/", ftpDir + fname + "/")
else:
if(ftp_host.upload_if_newer(localDir + fname, ftpDir + fname)):
print(ftpDir + fname + " is uploaded.")
else:
print(localDir + fname + " has already been uploaded.")
local_dir = "D:/Projects/.../"
ftp_dir = "/.../../"
upload_dir(local_dir, ftp_dir)
</code></pre>