调用splitlines()构建Pandas DataFrame报list无该属性错误
问题根因
报错的核心原因是类型不匹配:
- 之前使用的
result.content是Azure Form Recognizer返回的全文档拼接完成的字符串类型,因此可以直接调用字符串自带的splitlines()方法做按行拆分。 - 你现在赋值的
result.pages是DocumentPage对象构成的列表,每个元素对应PDF的单页识别结果,列表类型本身没有splitlines()方法,直接调用就会抛出你看到的AttributeError。
另外你原有代码还有一个逻辑问题:myoutput = result.pages写在了遍历blob的for循环外部,就算不报错,最终也只会拿到容器中最后一个文件的识别结果,前面所有文件的处理结果都会被覆盖。
解决方案
根据你的实际需求二选一即可:
方案1:仅需按行提取全文档纯文本,和原有逻辑对齐
不需要切换到result.pages,直接基于result.content做拆分即可,同时修正循环变量作用域问题:
import pandas as pd from azure.ai.formrecognizer import DocumentAnalysisClient, AzureKeyCredential document_analysis_client = DocumentAnalysisClient( endpoint=endpoint, credential=AzureKeyCredential(key) ) for blob in container.list_blobs(): blob_url = container_url + "/" + blob.name poller = document_analysis_client.begin_analyze_document_from_url( "prebuilt-read", blob_url) result = poller.result() print("Scanning " + blob.name + "...") # 直接对全文档字符串做按行拆分,DataFrame赋值放在循环内部 df_data = pd.DataFrame({'RAWTEXT': result.content.splitlines()}) # 此处追加你的df存储、后续处理逻辑,避免循环覆盖结果
方案2:需要保留页码、所属文件等元信息
如果你需要区分每行文本属于哪一页、哪个文件,就遍历result.pages提取结构化内容,这种方式比直接用splitlines()拆分准确率更高,因为page.lines是服务端已经识别完成的标准文本行结果,不会受换行符识别误差影响:
import pandas as pd from azure.ai.formrecognizer import DocumentAnalysisClient, AzureKeyCredential document_analysis_client = DocumentAnalysisClient( endpoint=endpoint, credential=AzureKeyCredential(key) ) all_text_rows = [] for blob in container.list_blobs(): blob_url = container_url + "/" + blob.name poller = document_analysis_client.begin_analyze_document_from_url( "prebuilt-read", blob_url) result = poller.result() print("Scanning " + blob.name + "...") # 逐页提取文本行 for page_idx, page in enumerate(result.pages, start=1): for line in page.lines: all_text_rows.append({ "RAWTEXT": line.content, "PAGE_NUMBER": page_idx, "SOURCE_FILE": blob.name }) # 所有文件处理完成后统一生成DataFrame df_data = pd.DataFrame(all_text_rows)
如果需要提取单字、表格、识别置信度、文本坐标等更细粒度的信息,也可以在遍历page、line的过程中从对应属性里取值即可。
内容的提问来源于stack exchange,提问作者Patterson
相关产品推荐
相关产品推荐

