You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python xlrd模块读取S3中Excel文件时遭遇访问权限错误

解决S3 Excel文件访问的Forbidden错误

嘿,我来帮你搞定这个问题!你遇到的Forbidden错误确实是因为S3私有桶的资源需要AWS身份认证,直接用urllib访问未签名的URL肯定会被拒绝。这里给你两种解决方案,优先推荐第一种,简单又靠谱:

方案一:用AWS官方库boto3(最推荐)

手动用urllib处理S3的签名请求太麻烦了,AWS官方的boto3库已经帮我们封装好了所有认证逻辑,用它来读取S3文件是最稳妥的方式。

步骤:

  1. 先安装boto3:
pip install boto3
  1. 编写代码读取Excel文件:
import boto3
import xlrd
from io import BytesIO

# 初始化S3客户端,你可以把密钥存在环境变量里(更安全),或者直接传入
s3_client = boto3.client(
    's3',
    aws_access_key_id='你的AWS_ACCESS_KEY',
    aws_secret_access_key='你的AWS_SECRET_ACCESS_KEY'
)

# 获取S3上的文件内容
response = s3_client.get_object(Bucket='bucket1', Key='final.xlsx')
file_content = response['Body'].read()

# 用xlrd读取文件内容
workbook = xlrd.open_workbook(file_contents=file_content)

# 接下来就可以正常操作workbook了,比如获取工作表
sheet = workbook.sheet_by_index(0)
print(f"第一行第一列内容:{sheet.cell_value(0, 0)}")

方案二:用urllib访问预签名URL(如果坚持用urllib)

如果你一定要用urllib,可以先通过boto3生成预签名URL——这个URL已经包含了临时的认证信息,用urllib直接访问就能拿到文件内容,不用手动处理签名逻辑。

代码示例:

import urllib.request
import xlrd
import boto3

# 初始化S3客户端
s3_client = boto3.client(
    's3',
    aws_access_key_id='你的AWS_ACCESS_KEY',
    aws_secret_access_key='你的AWS_SECRET_ACCESS_KEY'
)

# 生成有效期1小时(3600秒)的预签名URL
presigned_url = s3_client.generate_presigned_url(
    'get_object',
    Params={'Bucket': 'bucket1', 'Key': 'final.xlsx'},
    ExpiresIn=3600
)

# 用urllib访问这个预签名URL
file_content = urllib.request.urlopen(presigned_url).read()
workbook = xlrd.open_workbook(file_contents=file_content)

为什么不推荐手动用urllib加密钥?

S3的身份认证需要构造复杂的签名(涉及时间戳、请求方法、资源路径等多个参数的加密),手动实现很容易出错,而且维护成本高。用boto3的预签名URL或者直接get_object,既安全又省心。

内容的提问来源于stack exchange,提问作者user2966197

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:32:39