【问题标题】:Python3 ftplib not fetching larger binary filesPython3 ftplib 没有获取更大的二进制文件
【发布时间】:2015-02-03 18:45:56
【问题描述】:

我有以下脚本可以从远程 FTP 站点获取文件并在本地下载它们:

for i in ftp.nlst():
  ftp.retrbinary("RETR " + i, open(local_file_path + "/" + i, "wb").write)

调试信息显示正在获取文件,我可以看到它正在流式传输到本地系统。一段时间后,下载将停止,并且似乎已暂停...

get "150 Opening BINARY mode data connection for 'filename' (163479928 bytes).\n"
resp "150 Opening BINARY mode data connection for 'filename' (163479928 bytes)."

【问题讨论】:

    标签: python python-3.x ftp ftplib


    【解决方案1】:

    您是否尝试过使用 maxblocksize 参数?例如:

    ftp.retrbinary("RETR " + i, open(i, "wb").write, maxblocksize=1048576)
    

    我不确定是什么导致了您的问题,但如果您的文件很大,它可能与 FTP 服务器端的缓冲区大小有关。

    【讨论】:

    • 谢谢,我试试看。顺便说一句,在 Python 3 中它是 blocksize 而不是 maxblocksize ;) hg.python.org/cpython/file/3.4/Lib/ftplib.py#l426
    • 抱歉,我完全想念你问的关于 python 3 的问题 :) 我试图在我的测试 ftp 服务器上重现你的问题(我使用纯 ftpd)并使用了 python 3,但一切正常..跨度>
    【解决方案2】:

    如果您要检索多个文件,我会列出名称并确保每个文件都正确关闭。

    for name in ftp.nlst():
      print(name)  # for debugging
      with  open(local_file_path + "/" + name, "wb") as f:
          ftp.retrbinary("RETR " + i, f.write)
    

    【讨论】:

    • 我应该补充一点,我已经设置了 set_debuglevel(2),它将记录发送到服务器和从服务器发送的每个请求。我可以看到文件何时打开,但它永远不会关闭..
    【解决方案3】:

    这个问题的底线是互联网连接(下载速度 1.45MB)以及 ftplib 如何处理连接中断。当使用 retrbinary 并且连接被断开时,它永远不会恢复。 ftplib 需要支持块模式 (RFC 959),因此如果连接断开,它可以从收到的最新块开始恢复。

    【讨论】:

      猜你喜欢
      • 2019-09-25
      • 2014-04-01
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多