使用 python + boto3 将 s3 中的 docx/pdf 文件转换为 txt 文件并存储在 s3 中
Converting docx/pdf file in s3 to txt file and storing in s3 using python + boto3
我的情况是 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 上转换这些文件或者我在这个过程中做错了什么?非常感谢您的帮助。提前致谢。
StreamingBody
不是 docx2txt 似乎想要的可搜索文件。您需要将整个文件缓冲到其他文件中。例如,BytesIO
可能有效。
body=obj.get()['Body'].read()
buffer = io.BytesIO()
buffer.write(body)
text = docx2txt.process(buffer)
将对象转换为 BytesIO,如上面的代码所示。
我的情况是 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 上转换这些文件或者我在这个过程中做错了什么?非常感谢您的帮助。提前致谢。
StreamingBody
不是 docx2txt 似乎想要的可搜索文件。您需要将整个文件缓冲到其他文件中。例如,BytesIO
可能有效。
body=obj.get()['Body'].read()
buffer = io.BytesIO()
buffer.write(body)
text = docx2txt.process(buffer)
将对象转换为 BytesIO,如上面的代码所示。