Python 使用flask从s3 bucket读取docx文件会导致AttributeError
我有这么多不同的错误,我甚至不知道哪一个是相关的提及,但这不是关于凭据,因为我可以上传文件,我可以读取一个txt文件。现在我想读一篇docx 我在index.html中创建了一个表单,其中只有一个文本区域用于写入文件的确切名称,还有一个提交输入,它将打开一个新窗口,显示AWS S3 bucket中docx文件的段落数 我得到的错误是: 属性错误:“StreamingBody”对象没有属性“seek” 我的代码如下所示:Python 使用flask从s3 bucket读取docx文件会导致AttributeError,python,amazon-web-services,flask,amazon-s3,python-docx,Python,Amazon Web Services,Flask,Amazon S3,Python Docx,我有这么多不同的错误,我甚至不知道哪一个是相关的提及,但这不是关于凭据,因为我可以上传文件,我可以读取一个txt文件。现在我想读一篇docx 我在index.html中创建了一个表单,其中只有一个文本区域用于写入文件的确切名称,还有一个提交输入,它将打开一个新窗口,显示AWS S3 bucket中docx文件的段落数 我得到的错误是: 属性错误:“StreamingBody”对象没有属性“seek” 我的代码如下所示: path=“s3://***bucket/” bucket_name=“**
path=“s3://***bucket/”
bucket_name=“***bucket”
@app.route('/resultfiles',methods=[“POST”])
def getdata():
thefilename=request.form['file\u name']
如果文件名中有“.docx”:
object\u key=filename
file\u object=client.get\u object(Bucket=Bucket\u name,Key=object\u Key)
body=文件\对象['body']
doc=docx.Document(正文)
docx_paras=len(文件段落)
返回呈现模板('resultfiles.html',docx\u paras=docx\u paras)
我查看了python docx的文档,特别是:
docx.Document(docx=None)
返回从docx加载的文档对象,其中docx可以是.docx文件的路径(字符串)或类似文件的对象。如果缺少docx或没有docx,则加载内置的默认文档“模板”
它似乎期望一个类似文件的对象或文件的路径。我们可以将从boto3获得的不同表示转化为类似文件的对象,下面是一些示例代码:
导入io
进口boto3
进口docx
BUCKET\u NAME=“我的BUCKET”
def main():
s3=两种资源(“s3”)
bucket=s3.bucket(bucket\u名称)
对象\u在\u s3中=bucket.object(“test.docx”)
object_as_streaming_body=object_in_s3.get()[“body”]
打印(f“对象类型作为流体:{Type(对象类型作为流体)}”)
object_as_bytes=object_as_streaming_body.read()
打印(f“对象类型作为字节:{Type(对象类型作为字节)}”)
#现在我们使用BytesIO从字节流创建一个类似文件的对象
object_as_file_like=io.BytesIO(object_as_字节)
#瞧!
document=docx.document(docx=object\u as\u file\u like)
打印(文件.段落)
如果名称=“\uuuuu main\uuuuuuuu”:
main()
这就是它看起来的样子:
$python test.py
对象类型\u作为\u流\u体:
对象类型作为字节:
[]
我查看了python docx的文档,特别是:
docx.Document(docx=None)
返回从docx加载的文档对象,其中docx可以是.docx文件的路径(字符串)或类似文件的对象。如果缺少docx或没有docx,则加载内置的默认文档“模板”
它似乎期望一个类似文件的对象或文件的路径。我们可以将从boto3获得的不同表示转化为类似文件的对象,下面是一些示例代码:
导入io
进口boto3
进口docx
BUCKET\u NAME=“我的BUCKET”
def main():
s3=两种资源(“s3”)
bucket=s3.bucket(bucket\u名称)
对象\u在\u s3中=bucket.object(“test.docx”)
object_as_streaming_body=object_in_s3.get()[“body”]
打印(f“对象类型作为流体:{Type(对象类型作为流体)}”)
object_as_bytes=object_as_streaming_body.read()
打印(f“对象类型作为字节:{Type(对象类型作为字节)}”)
#现在我们使用BytesIO从字节流创建一个类似文件的对象
object_as_file_like=io.BytesIO(object_as_字节)
#瞧!
document=docx.document(docx=object\u as\u file\u like)
打印(文件.段落)
如果名称=“\uuuuu main\uuuuuuuu”:
main()
这就是它看起来的样子:
$python test.py
对象类型\u作为\u流\u体:
对象类型作为字节:
[]
您可能只需要在body上调用read()
方法:body=file\u object['body']。read()
然后您将得到一个二进制对象,docx库可能会使用它,也可能不会使用它。我trid刚read()但它不起作用,我也尝试了read()。decode('utf-8'),但仍然没有任何结果。你没有别的吗。您可能只需要在body上调用read()
方法:body=file\u object['body']。read()
然后您将得到一个二进制对象,docx库可能会使用它,也可能不会使用它。我trid刚才read()但它不起作用,我也尝试了read()。解码('utf-8'),但仍然没有任何结果。你没有别的吗。成功了!非常感谢你!成功了!非常感谢你!