python读取python读取s3存储文件下载

简介: python读取python读取s3存储文件下载

你可以使用 boto3 Python库来进行S3文件的读取和下载。下面是一个基本的示例代码:

import boto3

# 配置S3连接
s3 = boto3.resource('s3')
bucket_name = 'your-bucket-name'

# 定义要下载的文件名
file_key = 'your-file-path-in-s3'

# 下载文件
s3.Bucket(bucket_name).download_file(file_key, 'local-file-path')

这段代码首先通过boto3连接到S3并选择要读取的存储桶,然后定义要下载的文件路径和本地文件路径,并使用Bucket对象上的download_file方法实现下载。

注意需要安装boto3库,可以使用以下命令进行安装:

pip install boto3

如果要读取和下载的文件较大,你可以使用Range参数实现分块下载。下面是一个示例代码:

import boto3

# 配置S3连接
s3 = boto3.client('s3')
bucket_name = 'your-bucket-name'

# 定义要下载的文件名
file_key = 'your-file-path-in-s3'

# 定义每次下载的块大小和起始位置,并生成本地文件名
chunk_size = 1024 * 1024 # 1 MB
start_byte = 0
local_file_path = 'local-file-path'

while True:
    # 使用range参数获取要下载的字节范围
    end_byte = start_byte + chunk_size - 1
    range_str = f"bytes={start_byte}-{end_byte}"

    # 下载块并将其追加到本地文件
    resp = s3.get_object(Bucket=bucket_name, Key=file_key, Range=range_str)
    to_write = resp['Body'].read()
    if len(to_write) == 0:
        break
    with open(local_file_path, 'ab') as f:
        f.write(to_write)

    # 更新起始位置以准备下一块的下载
    start_byte += chunk_size

这段代码使用了boto3client对象,通过设置range参数,将文件分块下载,并逐块写入本地文件,因为默认下载工具只会一次加载整个文件从而造成大量内存的占用,降低程序效率和稳定性。

如果你遇到了如下错误:

An error occurred (InvalidArgument) when calling the GetObject operation: Requests specifying a byte-range must include an If-Range header.

这是因为使用了Range参数后,必须同时指定一个If-Range头信息,指定下载起始位置。你可以使用以下代码添加If-Range头信息:

import boto3

# 配置S3连接
s3 = boto3.client('s3')
bucket_name = 'your-bucket-name'

# 定义要下载的文件名
file_key = 'your-file-path-in-s3'
local_file_path = 'local-file-path'

# 获取文件大小,作为设置`If-Range`头信息的依据
file_size = s3.head_object(Bucket=bucket_name, Key=file_key)['ContentLength']

# 定义每次下载的块大小,分块下载并追加到本地文件
chunk_size = 1024 * 1024 # 1 MB
start_byte = 0
while True:
    end_byte = start_byte + chunk_size - 1
    range_str = f'bytes={start_byte}-{end_byte}/{file_size}'
    resp = s3.get_object(Bucket=bucket_name, Key=file_key, Range=range_str, IfRange=file_size)
    to_write = resp['Body'].read()
    if len(to_write) == 0:
        break
    with open(local_file_path, 'ab') as f:
        f.write(to_write)
    start_byte += chunk_size

这里我使用了head_object来获取文件大小,然后将其作为If-Range头信息的值。

如果你遇到了 botocore.exceptions.ConnectionClosedError 错误,这通常意味着某些网络问题,或者AWS端点问题,导致连接未能从AWS端点接收到有效的响应,再次请求可能解决问题。

尝试重新运行你的代码或等待一段时间再尝试使用相同的 AWS 凭证登录,看看这些步骤是否能够解决问题。 如果问题仍然存在,你可以尝试以下解决方案:

  • 确保您的代码中使用的AWS凭证已授权对S3存储桶和对象进行操作。
  • 确保你的网络连接是稳定的,并且网络设备没有任何故障。
  • 确保AWS的服务可用。你可以在AWS健康状态仪表板上查看AWS服务的当前状态。
  • 通过将 config 参数传递给 boto3.client() 来增加连接超时或重试次数。例如:
import boto3
from botocore.config import Config

s3 = boto3.client('s3', config=Config(connect_timeout=10, retries={
   'max_attempts': 5}))

这里将连接超时设置为10秒,并最大重试次数设置为5次。你可以根据需要调整这些参数。

如果你仍然遇到 botocore.exceptions.ConnectionClosedError 错误,可以尝试进一步调试网络问题。

在你的代码中添加以下代码打印出调试信息:

import boto3
import botocore
from botocore.config import Config

# 定义S3连接配置并开启调试模式
s3_config = Config(connect_timeout=10,
                   retries={
   'max_attempts': 5},
                   debug={
   'http': {
   'response': True, 'http2': True}})

# 创建S3客户端并使用连接配置
s3_client = boto3.client('s3', config=s3_config)

try:
    # 尝试访问S3对象
    response = s3_client.get_object(Bucket='my-bucket', Key='mykey')
    print(response)
except botocore.exceptions.ClientError as e:
    print(f"Got an error: {e.response['Error']['Code']}")
    print(f"Debug info: {e.response['ResponseMetadata']['HTTPHeaders']}")

以上代码中,我们使用 botocore.config.Config 开启了调试模式,并尝试访问 S3 对象。如果访问过程中出现错误,代码将会输出调试信息,从而帮助你进一步检查和解决问题。

当你运行上述代码并遇到 ConnectionClosedError 错误时,检查调试输出信息是否包含类似以下内容:

DEBUG - Response headers: {'x-amz-request-id': '...', 'x-amz-id-2': '...', 'content-type': 'application/xml', 'transfer-encoding': 'chunked', 'date': '...', 'server': 'AmazonS3'}, response payload: '<?xml version="1.0" encoding="UTF... (truncated)'

这个输出表示 AWS S3 返回了 XML 格式的错误信息。尝试在 S3 控制台中查找错误代码,或者按错误输出信息提示进一步解决问题。

相关文章
|
3月前
|
Web App开发 安全 数据安全/隐私保护
利用Python+Requests实现抖音无水印视频下载
利用Python+Requests实现抖音无水印视频下载
|
3月前
|
存储 JSON API
Python与JSON:结构化数据的存储艺术
Python字典与JSON格式结合,为数据持久化提供了便捷方式。通过json模块,可轻松实现数据序列化与反序列化,支持跨平台数据交换。适用于配置管理、API通信等场景,兼具可读性与高效性,是Python开发中不可或缺的数据处理工具。
133 0
|
16天前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
8月前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
230 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
5月前
|
数据采集 存储 NoSQL
Python爬虫Cookie管理最佳实践:存储、清理与轮换
Python爬虫Cookie管理最佳实践:存储、清理与轮换
|
12月前
|
PyTorch Linux 算法框架/工具
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
这篇文章是关于如何使用Anaconda进行Python环境管理,包括下载、安装、配置环境变量、创建多版本Python环境、安装PyTorch以及使用Jupyter Notebook的详细指南。
1391 1
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
|
8月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
262 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
8月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
246 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
9月前
|
前端开发 搜索推荐 编译器
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
386 34
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
|
7月前
|
机器学习/深度学习 数据采集 数据可视化
Python/Anaconda双方案加持!Jupyter Notebook全平台下载教程来袭
Jupyter Notebook 是一款交互式编程与数据科学分析工具,支持40多种编程语言,广泛应用于机器学习、数据清洗和学术研究。其核心优势包括实时执行代码片段、支持Markdown文档与LaTeX公式混排,并可导出HTML/PDF/幻灯片等格式。本文详细介绍了Jupyter Notebook的软件定位、特性、安装方案(Anaconda集成环境与原生Python+PIP安装)、首次运行配置及常见问题解决方案,帮助用户快速上手并高效使用该工具。

热门文章

最新文章

推荐镜像

更多