使用Python xlrd模块读取S3中Excel文件时遭遇访问权限错误
解决S3 Excel文件访问的Forbidden错误
嘿,我来帮你搞定这个问题!你遇到的Forbidden错误确实是因为S3私有桶的资源需要AWS身份认证,直接用urllib访问未签名的URL肯定会被拒绝。这里给你两种解决方案,优先推荐第一种,简单又靠谱:
方案一:用AWS官方库boto3(最推荐)
手动用urllib处理S3的签名请求太麻烦了,AWS官方的boto3库已经帮我们封装好了所有认证逻辑,用它来读取S3文件是最稳妥的方式。
步骤:
- 先安装boto3:
pip install boto3
- 编写代码读取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
相关产品推荐
相关产品推荐

