【问题标题】:Converting docx/pdf file in s3 to txt file and storing in s3 using python + boto3将s3中的docx / pdf文件转换为txt文件并使用python + boto3存储在s3中
【发布时间】:2017-08-23 15:35:41
【问题描述】:

我的情况是我将 docx/pdf 文件存储在 S3 中。我需要将这些文件转换为 txt 文件,然后将转换后的文件存储在 S3 中。我正在使用 docx2txt 库(docx2txt 0.5:https://pypi.python.org/pypi/docx2txt/)。以下是我的代码和错误:

import boto3
import docx2txt
s3 = boto3.resource('s3')
bucket = s3.Bucket('client-shared-file')
obj = s3.Object(bucket.name, 'key name');
text = docx2txt.process(obj.get()['Body']) //I also tried .read() but still not work
print(text)

错误:

Traceback (most recent call last):
  File ".../PycharmProjects/untitled/test.py", line 6, in <module>
    text = docx2txt.process(obj.get()['Body'])
  File "...\Anaconda3\lib\site-packages\docx2txt\docx2txt.py", line 76, in process
    zipf = zipfile.ZipFile(docx)
  File "...\Anaconda3\lib\zipfile.py", line 1026, in __init__
    self._RealGetContents()
  File "...\Anaconda3\lib\zipfile.py", line 1089, in _RealGetContents
    endrec = _EndRecData(fp)
  File "...\Anaconda3\lib\zipfile.py", line 241, in _EndRecData
    fpin.seek(0, 2)
AttributeError: 'StreamingBody' object has no attribute 'seek'

这是对象:

{
    'ResponseMetadata': {
        'RequestId': 'RequestId', 
        'HostId': 'HostId', 
        'HTTPStatusCode': 200
        }, 
    'AcceptRanges': 'bytes', 
    'Metadata': {}, 
    'ContentType': 'application/msword', 
    'ContentLength': 66235, 
    'Body': <botocore.response.StreamingBody object at 0x00000219C885FF28>, 
    'ETag': '"ETag"', 
    'LastModified': 'LastModified'
}

似乎 boto3 StreamingBody 不能用作 docx2txt 函数中的 docx 文件。无论如何要在 s3 上转换这些文件,或者我在这个过程中做错了什么?非常感谢您的帮助。提前致谢。

【问题讨论】:

  • 很抱歉,为什么我会投反对票?请告诉我。

标签: python amazon-web-services amazon-s3 docx boto3


【解决方案1】:
body=obj.get()['Body'].read()
buffer = io.BytesIO()
buffer.write(body)
text = docx2txt.process(buffer)

将对象转换为 BytesIO,如上面的代码所示。

【讨论】:

    【解决方案2】:

    StreamingBody 不是 docx2txt 似乎想要的可搜索文件。您需要将整个文件缓冲到其他内容中。例如,BytesIO 可能会起作用。

    【讨论】:

    • 你能帮我把 StreamingBody 转换成 BytesIO 进程吗?
    • Philips 我使用以下代码 text = docx2txt.process(io.BytesIO(obj.get()['Body'].read())) 并出现此错误:Traceback(最近一次调用最后一次):文件“test.py”,第 18 行,在 text = docx2txt.process(io.BytesIO(obj.get()['Body'].read())) 文件“Anaconda3\lib\site-packages\docx2txt\docx2txt.py”,第 76 行,处理中 zipf = zipfile.ZipFile(docx) 文件“Anaconda3\lib\zipfile.py”,第 1026 行,在 init self._RealGetContents() 文件“Anaconda3\lib\zipfile.py”,第 1093 行,在 _RealGetContents raise BadZipFile("文件不是 zip 文件")
    猜你喜欢
    • 2018-04-29
    • 2020-12-12
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2021-07-30
    • 1970-01-01
    • 2017-09-13
    相关资源
    最近更新 更多