Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用flask从s3 bucket读取docx文件会导致AttributeError_Python_Amazon Web Services_Flask_Amazon S3_Python Docx - Fatal编程技术网

Python 使用flask从s3 bucket读取docx文件会导致AttributeError

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=“**

我有这么多不同的错误,我甚至不知道哪一个是相关的提及,但这不是关于凭据,因为我可以上传文件,我可以读取一个txt文件。现在我想读一篇docx

我在index.html中创建了一个表单,其中只有一个文本区域用于写入文件的确切名称,还有一个提交输入,它将打开一个新窗口,显示AWS S3 bucket中docx文件的段落数

我得到的错误是:

属性错误:“StreamingBody”对象没有属性“seek”

我的代码如下所示:

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'),但仍然没有任何结果。你没有别的吗。成功了!非常感谢你!成功了!非常感谢你!