Python读取Dropbox中Doc/Docx文件遇异常,求可行解决方案
解决远程Doc/Docx文件读取及表格提取问题
第一步:正确从Dropbox获取文件二进制内容
之前下载本地文件为空,核心是Dropbox API调用方式有误,需确保完整获取二进制流:
import dropbox from io import BytesIO dbx = dropbox.Dropbox("你的Dropbox API令牌") remote_file_path = "/目标文件夹/文件.docx" # 调用files_download获取元数据和响应对象 metadata, response = dbx.files_download(remote_file_path) # 直接提取二进制内容,不要提前解码 docx_binary = response.content # 可选:验证内容完整性,写入本地文件 with open("本地验证文件.docx", "wb") as f: f.write(docx_binary)
第二步:用python-docx读取文本和提取表格
获取到完整二进制内容后,直接用python-docx处理(无需存本地也可):
提取文本内容(保留段落格式)
from docx import Document # 用BytesIO包装二进制内容,模拟本地文件对象 doc = Document(BytesIO(docx_binary)) paragraph_texts = [para.text for para in doc.paragraphs] full_text = "\n".join(paragraph_texts)
提取表格并转为Pandas DataFrame
import pandas as pd table_dfs = [] for table in doc.tables: # 逐行提取单元格内容 table_rows = [] for row in table.rows: row_content = [cell.text.strip() for cell in row.cells] table_rows.append(row_content) # 第一行作为表头,后续行作为数据 df = pd.DataFrame(table_rows[1:], columns=table_rows[0]) table_dfs.append(df) # table_dfs中存储了所有表格的DataFrame对象
第三步:处理旧版.doc格式文件
如果涉及.doc格式(python-docx不支持),可通过系统自带Word组件处理:
Windows环境(用pywin32)
import win32com.client import os # 先写入临时文件 temp_doc_path = "temp.doc" with open(temp_doc_path, "wb") as f: f.write(doc_binary) word = win32com.client.Dispatch("Word.Application") doc = word.Documents.Open(os.path.abspath(temp_doc_path)) # 读取文本 full_text = doc.Content.Text # 提取表格 table_dfs = [] for table in doc.Tables: table_rows = [] for row_idx in range(1, table.Rows.Count + 1): row_content = [] for col_idx in range(1, table.Columns.Count + 1): row_content.append(table.Cell(row_idx, col_idx).Range.Text.strip()) table_rows.append(row_content) df = pd.DataFrame(table_rows[1:], columns=table_rows[0]) table_dfs.append(df) doc.Close() word.Quit() os.remove(temp_doc_path)
MacOS环境(用appscript)
from appscript import app, k import os temp_doc_path = "temp.doc" with open(temp_doc_path, "wb") as f: f.write(doc_binary) word = app('Microsoft Word') doc = word.open(os.path.abspath(temp_doc_path)) full_text = doc.text.get() table_dfs = [] for table in doc.tables(): table_rows = [] for row in table.rows(): row_content = [cell.text.get().strip() for cell in row.cells()] table_rows.append(row_content) df = pd.DataFrame(table_rows[1:], columns=table_rows[0]) table_dfs.append(df) doc.close() os.remove(temp_doc_path)
关键注意事项
- 永远不要直接对Doc/Docx二进制内容做字符串解码,这类文件是复合二进制格式,必须用专用库处理
- 用Dropbox API获取文件时,务必使用
files_download方法,不要尝试手动读取远程路径的"文本内容"
内容的提问来源于stack exchange,提问作者DP92_A_Yellow
相关产品推荐
相关产品推荐

