如何将通过Google Drive API的files.get_media()获取的docx文件字节流转换为文本?
如何将通过Google Drive API的files.get_media()获取的docx文件字节流转换为文本?
我太懂你这种折腾半天卡壳的感觉了!花了好几周就为了把Google Drive里的docx文件转成纯文本,好不容易用API拿到了字节流,结果解码报错、转不出来,确实够闹心的。
首先得给你说清楚为啥直接解码不行:docx文件本质上是压缩的XML格式包,不是纯文本文件,里面有大量非文本的二进制数据,直接用decode()去转肯定会报“无效续字节”这种错误,哪怕忽略错误也拿不到有用的内容。
解决办法其实很简单,用专门处理docx文件的Python库python-docx就行,下面是修改后的完整代码,你可以直接用:
from docx import Document from googleapiclient.discovery import build from googleapiclient.http import MediaIoBaseDownload import io # 你的原有代码部分,获取字节流 service = build("drive", "v3", credentials=creds) file_id = real_file_id request = service.files().get_media(fileId=file_id) file = io.BytesIO() downloader = MediaIoBaseDownload(file, request) done = False while done is False: status, done = downloader.next_chunk() print(f"Download {int(status.progress() * 100)}%.") # 关键的转文本步骤 file.seek(0) # 把字节流的指针移到开头,因为下载完成后指针在末尾 doc = Document(file) full_text = [] for para in doc.paragraphs: full_text.append(para.text) docx_text = '\n'.join(full_text) print(docx_text) # 这就是你要的纯文本内容了
给你拆解下关键步骤:
- 下载完成后,必须调用
file.seek(0)把BytesIO的文件指针移到开头,不然Document()读取的时候会从空的末尾开始读,拿不到内容。 docx.Document()可以直接读取BytesIO里的docx二进制内容,不用先存成本地文件。- 遍历
doc.paragraphs就能拿到每一段的文本,最后拼接成完整的字符串就行。
如果你的docx里还有表格、图片这些内容,python-docx也能处理,比如提取表格内容可以遍历doc.tables,不过如果只是要普通段落文本,上面的代码就足够了。
备注:内容来源于stack exchange,提问作者wafflehouse67
相关产品推荐
相关产品推荐

