使用python通过FTP下载大文件

2023-11-24

我尝试每天从我的服务器下载备份文件到本地存储服务器,但我遇到了一些问题。

我写了这段代码(删除了无用的部分,如电子邮件功能):

import os
from time import strftime
from ftplib import FTP
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email import Encoders

day = strftime("%d")
today = strftime("%d-%m-%Y")

link = FTP(ftphost)
link.login(passwd = ftp_pass, user = ftp_user)
link.cwd(file_path)
link.retrbinary('RETR ' + file_name, open('/var/backups/backup-%s.tgz' % today, 'wb').write)
link.delete(file_name) #delete the file from online server
link.close()
mail(user_mail, "Download database %s" % today, "Database sucessfully downloaded: %s" % file_name)
exit()

我用一个 crontab 运行它,例如:

40    23    *    *    *    python /usr/bin/backup-transfer.py >> /var/log/backup-transfer.log 2>&1

它适用于小文件,但备份文件(约 1.7Gb)会冻结,下载的文件约为 1.2Gb,然后永远不会增长(我等了大约一天),并且日志文件为空。

任何想法?

p.s:我使用Python 2.6.5


抱歉,如果我回答我自己的问题,但我找到了解决方案。

我尝试了 ftputil 但没有成功,所以我尝试了很多方法,最后,这有效:

def ftp_connect(path):
    link = FTP(host = 'example.com', timeout = 5) #Keep low timeout
    link.login(passwd = 'ftppass', user = 'ftpuser')
    debug("%s - Connected to FTP" % strftime("%d-%m-%Y %H.%M"))
    link.cwd(path)
    return link

downloaded = open('/local/path/to/file.tgz', 'wb')

def debug(txt):
    print txt

link = ftp_connect(path)
file_size = link.size(filename)

max_attempts = 5 #I dont want death loops.

while file_size != downloaded.tell():
    try:
        debug("%s while > try, run retrbinary\n" % strftime("%d-%m-%Y %H.%M"))
        if downloaded.tell() != 0:
            link.retrbinary('RETR ' + filename, downloaded.write, downloaded.tell())
        else:
            link.retrbinary('RETR ' + filename, downloaded.write)
    except Exception as myerror:
        if max_attempts != 0:
            debug("%s while > except, something going wrong: %s\n \tfile lenght is: %i > %i\n" %
                (strftime("%d-%m-%Y %H.%M"), myerror, file_size, downloaded.tell())
            )
            link = ftp_connect(path)
            max_attempts -= 1
        else:
            break
debug("Done with file, attempt to download m5dsum")
[...]

在我的日志文件中我发现:

01-12-2011 23.30 - Connected to FTP
01-12-2011 23.30 while > try, run retrbinary
02-12-2011 00.31 while > except, something going wrong: timed out
    file lenght is: 1754695793 > 1754695793
02-12-2011 00.31 - Connected to FTP
Done with file, attempt to download m5dsum

遗憾的是,即使文件已完全下载,我也必须重新连接到 FTP,这在我的 cas 中不是问题,因为我也必须下载 md5sum。

正如您所看到的,我无法检测超时并重试连接,但是当我超时时,我只需再次重新连接即可;如果有人知道如何在不创建新的 ftplib.FTP 实例的情况下重新连接,请告诉我;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用python通过FTP下载大文件 的相关文章

  • Django:模拟模型上的字段

    如何将模拟对象分配给该模型上的用户字段 无论如何都要绕过 SomeModel user 必须是 User 实例 检查吗 class SomeModel models Model user models ForeignKey User 我不会
  • 切片稀疏(scipy)矩阵

    我将不胜感激任何帮助 以理解从 scipy sparse 包中切片 lil matrix A 时的以下行为 实际上 我想根据行和列的任意索引列表提取子矩阵 当我使用这两行代码时 x1 A list 1 x2 x1 list 2 一切都很好
  • 为什么我的代码不能根据字典解码加密字符串?

    我有一本字典 其中包含代表字母的键和值 例如一个简单的 DICT CODE b g n a p o x d t y 我收到了一个加密代码 并将该字符串转换为一个列表 其中每个项目都是一个单词 我需要根据字典中的项目来解决它 代码示例是 wo
  • TF map_fn 或 while_loop 用于不同形状的张量列表

    我想处理不同形状的张量序列 列表 并输出另一个张量列表 考虑每个时间戳上具有不同隐藏状态大小的 RNN 就像是 输入 tf ones 1 2 2 tf ones 2 2 3 tf ones 3 2 1 输出 tf zeros 1 2 4 t
  • 在 macOS 中通过 Python 访问进程的压缩 RAM(顶部的 CMPRS)的方法?

    我试图弄清楚如何从 Python 访问任何给定进程占用的实际 RAM 量 我发现 psutil Process PID memory info rss 工作得很好 直到操作系统决定开始压缩某些进程的 RAM 然后 所有的 memory in
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • WindowsError:[错误 126] 使用 ctypes 加载操作系统时

    python代码无法在Windows 7平台上运行 def libSO lib ctypes cdll LoadLibrary ConsoleApplication2 so lib cfoo2 1 3 当我尝试运行它时 得到来自python
  • python 中的 Johansen 协整检验

    我找不到任何有关在处理统计和时间序列分析 pandas 和 statsmodel 的 Python 模块中执行 Johansen 协整检验的功能的参考 有谁知道是否有一些代码可以执行时间序列之间的协整测试 现在 这已在 Python 的 s
  • 使用 scipy curve_fit 拟合噪声指数的建议?

    我正在尝试拟合通常按以下方式建模的数据 def fit eq x a b c d e return a 1 np exp x b c np exp x d e x np arange 0 100 0 001 y fit eq x 1 1 1
  • PySide6.1 与 matplotlib 3.4 不兼容

    当我只安装PySide6时 GUI程序运行良好 但是一旦我安装了matplotlib及其依赖包 包括pyqt5 则GUI程序将无法运行并输出以下错误消息 This application failed to start because no
  • 使用 numpy 在 python 中执行最大方差旋转

    我正在研究矩阵的主成分分析 我已经找到了如下所示的组件矩阵 A np array 0 73465832 0 24819766 0 32045055 0 3728976 0 58628043 0 63433607 0 72617152 0 5
  • 由于 json 字符串化 dict 键导致数据丢失

    考虑下面的例子 gt gt gt import json gt gt gt d 0 potato 0 spud gt gt gt json dumps d 0 potato 0 spud gt gt gt json loads json d
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • Python]将两个文本文件合并为一个(逐行)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是蟒蛇新手 我想做的是将文件 a 和文件 b 逐行合并到一个文件中 例如 text file a a n b n c text fi
  • 检测 IDLE 的存在/如何判断 __file__ 是否未设置

    我有一个脚本需要使用 file 所以我了解到 IDLE 没有设置这个 有没有办法从我的脚本中检测到 IDLE 的存在 if file not in globals file is not set 如果你想做一些特别的事情 file 未设置
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • 更改 Python Cmd 模块处理自动完成的方式

    我有一个 Cmd 控制台 设置为自动完成 Magic the Gathering 收藏管理系统的卡牌名称 它使用文本参数在数据库中查询卡片 并使用结果自动完成 建议卡片 然而 这些卡片名称有多个单词 Cmd 会从last到行尾的空间 例如
  • 如何在单元测试中使用 JSON 发送请求

    我的 Flask 应用程序中有在请求中使用 JSON 的代码 我可以像这样获取 JSON 对象 Request request get json 这一直工作得很好 但是我正在尝试使用 Python 的 unittest 模块创建单元测试 但
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro

随机推荐

  • CRM 2011 工作流程“无效指针”错误

    我在 CRM 2011 中有一个自定义工作流程 它是针对自定义实体记录手动触发的 当选择单个记录进行处理时 工作流始终会成功 但是 当选择多条记录时 至少有一条会失败 即使使用相同的数据 每次尝试提供的错误似乎也有所不同 到目前为止我遇到的
  • Javascript toLocaleTimeString() 在最新版本的 Chrome 中返回 ASCII 226 而不是空格

    我们使用 Javascript 函数 toLocaleTimeString 来解析日期 时间 最新版本的 Chrome 在秒和 AM PM 部分之间突然返回 ASCII 226 Edge 没有任何问题 旧版本的 Chrome 也没有任何问题
  • VueRouter 默认子路由不带尾部斜杠

    VueRouter 总是在子路由的路径之前添加尾部斜杠 假设我有一个这样的路由配置 const routes path home components default HomeBase children path component Hom
  • 使用 OpenCV Python 检测并可视化两个图像之间的差异

    我有两张图片 希望能清楚地表明差异所在 我想为这两个图像添加颜色 以便用户可以在一两秒内清楚地发现所有差异 例如 这里有两张有一些差异的图像 leftImage jpg rightImage jpg 我目前使差异变得明显的方法是创建一个蒙版
  • 如何对 BindingList 进行排序?

    我有数千个 MyClass 对象存储在BindingList
  • 标准差 NumPy 函数的内存消耗

    我目前正在使用 GDAL 的 Python 绑定来处理相当大的栅格数据集 gt 4 GB 由于将它们立即加载到内存中对我来说不是可行的解决方案 因此我将它们读入较小的块并逐段进行计算 为了避免为每个块读取进行新的分配 我正在使用buf ob
  • 如何在iOS应用程序项目中正确嵌入第3方.dylib文件以供App Store发布?

    我正在使用支持 H264 的 PJSIP 库构建一个 iOS 应用程序 构建 H264 时 我得到 1 个 a 文件和 2 个 dylib 文件 我尝试通过添加为 嵌入式库 以及创建一个单独的框架然后将其添加到 嵌入式库 来在我的项目中使用
  • 使用非连续行号的数据子集

    我有一个 30 行 100 列 X 的数据框 我想创建一个新的数据框 Y 其中包含较大数据框中的特定行 例如 我希望数据框 Y 包含第 1 行到第 5 行 第 10 行到第 14 行以及第 20 行 我知道我可以使用代码 Y lt X 1
  • 使用 g++ 的符号可见性

    我在 Linux Mac 下编译了一个隐藏了符号的 C 库 我用过 attribute visibility hidden 对于我所有的课程并使用选项进行编译 c O2 fPIC MMD MP MF Mac下 使用Mac 依赖项 工作完成得
  • 检测已安装的 Excel 版本(和 Service Pack)

    我需要能够从我正在开发的一些 NET 代码中检测我的计算机中安装的 Excel 版本 我目前正在使用应用程序版本为此 但它没有给我有关服务包的信息 我宁愿避免这样的事情 http www mvps org access api api006
  • 添加代码块而不执行它

    In knitr 是否有任何选项允许插入代码而不执行 我只希望代码以与其他代码相同的样式出现在文档中knitr代码块 我对 Rnw 文档中的 LaTeX 选项特别感兴趣 就像 Ramnath 评论的那样 这可以通过使用来实现eval FAL
  • Facebook 的 5000 个帖子 API 限制

    我对 Facebook 限制 API 调用的方式有疑问 到本文底部 http developers facebook com blog post 478 脸书 说 除了上面列出的每个表和连接的文档中提到的限制之外 了解我们在运行可见性检查之
  • 从 WCF 中分块获取大 List

    我正在尝试从 WCF 服务获取实体列表 我遇到的问题是网络上存在一些严重的延迟 因此数据需要相当长的时间才能到达我的客户端 我的想法是找到一种方法来获取前 1000 个 然后将它们推送到 UI 同时等待下一个到达 我想这就像分页 但我只想对
  • 为什么内部类可以有静态final成员但不能有静态方法?

    为什么我们可以在非静态内部类中拥有静态最终成员但不能拥有静态方法 我们可以在外部类之外访问内部类的 static Final 成员变量而不实例化内部类吗 您可以在 a 中使用静态方法static 内 类 public class Outer
  • 什么是规范 URL 以及它们如何影响您的 SEO?

    我听人们提到过 Canonical URL 标签 但我不知道它的含义或目的是什么 它是什么以及它如何影响 SEO 当您拥有指向相同内容但没有实际重定向的不同 URL 时 可以使用规范 URL 假设您的域名是example com www e
  • 在 ASP.NET Core 中使用实体框架 6

    假设我有 适用于 NET Core 框架的 ASP NET Core 独立 Web API 项目 具有完整 NET 框架的 EF6 数据模型的类库 ASP NET Core项目引用类库 这里提出的架构 https learn microso
  • django dev 服务器,向静态文件添加标头

    使用 django 开发服务器 1 7 4 我想向它提供的所有静态文件添加一些标头 看起来我可以将自定义视图传递给django conf urls static static 像这样 if settings DEBUG from djang
  • 为什么Javascript中.length后面没有()?

    我是一名业余程序员 我研究过多种语言 几乎总是发现 长度 是一种方法 函数 据我所知 我已经接受过培训 任何方法调用都必须在后面加上括号 即使没有参数也是如此 在 Javascript 中并非如此 为什么 C length 或 length
  • 为什么java中不能在一个文件中定义两个公共类? [复制]

    这个问题在这里已经有答案了 为什么B类不能公开 如何在其他班级中使用班级 是不是在 Cons 里面定义比较好 public class B why not class B int x B int n x n System out print
  • 使用python通过FTP下载大文件

    我尝试每天从我的服务器下载备份文件到本地存储服务器 但我遇到了一些问题 我写了这段代码 删除了无用的部分 如电子邮件功能 import os from time import strftime from ftplib import FTP