
哈喽各位小伙伴们!
你们在说数据处理分析时候是不是也会烦恼,数据量大,时间紧,完不成任务。
下面给小伙伴们讲一个我们亲自遇到的案例时间:
前段时间快下班了,接到一个复杂的任务,

。
领导甩来一个文件夹,这个文件夹里面跟套娃似的,叠了 N 层子文件夹N个子文件夹下还有N个文件夹,最后一级文件下有如下内容:
1.Word文档的命名不规则,路径和命名还有特殊字符,格式有的的doc有的是docx格式的,其中word文档内容中包含文字说明、表格,有的表格中插入了照片,文档内容包含多页。
2. dwg格式的数据统一命名不规则,包含多个dwg,有的是dxf,有的是dwg,并且dwg打开版本还不一样,有的是2008版,有的是2018版,命名不规范数据很乱。
3.其他数据(包括excel、shp数据、bak格式的数据、xml格式的数据)等。
领导要求最终提交表格部分内容如下所示:
年度 | 乡镇 | 地址 | 姓名 | 面积 | 备注 |
1.按年度在word报告中提取表格中的内容;
2.将dwg格式的路径提取出来;
3.最后按word报告中的姓名命名该文件夹下dwg格式数据同时命名成一致的。
我初步筛选了下,这个文件夹包括将近5000多个word(格式有doc和docx)和8000多个dwg。


你们遇到这种情况,是不是马上崩溃!!!

拉上三五个小伙伴手动复制粘贴,重命名弄到天黑都搞不完!最少搞3天吧

如果你们也有遇到过类似的情况,
别慌!今天就教你们用 ArcGIS Pro 里的 Python,当一回 “文件夹拆迁队”+“Word 内容挖掘机”,不管多少层子文件夹、Word 里有图有表有文字,一键给你扒得明明白白,效率直接拉满!
老规矩,开始之前先放手轻松欢快的歌曲,放松下

。








最简单的方法如下图所示:

代码解释:通过递归遍历主文件夹所有子目录,对目录下的CAD格式数据进行筛选,只筛选后缀名为.dwg文件,最后将.dwg文件的绝对路径逐行写入Excel A列。小伙伴们只需要修改路径即可:
代码如下所示
import osfrom openpyxl import Workbook# ========== 配置区域,自己改路径 ==========root_folder = r"D:\你的总文件夹路径" # 根目录save_excel_path = r"D:\dwg文件清单.xlsx"# =======================# 新建工作簿wb = Workbook()ws = wb.activews.title = "DWG路径清单"ws["A1"] = "DWG文件绝对路径"row = 2 # 从第二行开始写数据# 递归遍历所有文件for dirpath, _, filenames in os.walk(root_folder):for file in filenames:# 忽略大小写 .DWG/.dwgif file.lower().endswith(".dwg"):full_path = os.path.abspath(os.path.join(dirpath, file))ws.cell(row=row, column=1, value=full_path)row += 1# 保存Excelwb.save(save_excel_path)print(f"DWG路径抓取完成,共写入{row-2}个文件,保存至:{save_excel_path}")
完成截图如下所示:
任务2:提取word中的所有内容
第一步:安装两个 “小助手”第三方包
1.python-docx:专门对付.docx 格式的 Word,文字、表格都能抓;
2.win32com:主要通过调用Windows系统的 COM 接口,对 Windows 软件(如 Office 系列、Adobe 软件等),实现文档生成、数据处理、界面操作等自动化任务。
安装方法之前的文章已经说过了,这就不再说了。
3.这里很重要:小伙伴们需要特别注意的是,装有wps的电脑没有安装高版本的word可能导致下面的代码出错,原因是老版本的office2003行数有限,当写入的word内容数据行数过大时,代码就自动报错了,所以我提前安装了office2019版。
4.还有就是我们的电脑提示打开word的默认方式是wps,后面我们通过设置修改为打开方式为Excel的模式。在设置中搜索按应用设置默认值,选择好分别word和Excel后,点击管理,选择好默认程序为你安装的word和Excel版本,一定别选择wps,否则允许代码要报错,给小伙伴们截图了。
按应用设置默认值截图

设置word默认打开程序:

设置Excel默认打开程序:

第二步:提取Word 全部内容
核心思路是:让 Python 代码先把所有子文件夹里的 Word 全找出来(不管套多少层),再逐个打开 Word,把文字、表格、分别抓出来存好。
直接套用以下是完整代码。
import osimport reimport pythoncomimport win32com.client as win32import pandas as pd# ===== 改成你自己的路径 =======root_dir = r"G:\父级文件夹" # 顶层目录excel_out = r"G:\成果\test.xlsx" # 输出Exceldef clean_text(text):"""清洗文本:移除Excel不支持的非法控制字符、不可见字符"""if not text:return "" # 1. 移除所有ASCII控制字符(0-31,127),包括报错的_x0007_、换行、制表符等text = re.sub(r'[\x00-\x1F\x7F]', '', text) # 2. 替换多余空格(可选,让格式更整洁)text = re.sub(r'\s+', ' ', text).strip()return textdef read_doc_lines(file_path):"""用 Word 按行读取文档内容,返回行列表"""pythoncom.CoInitialize()try:word = win32.DispatchEx("Word.Application")word.Visible = Falseword.DisplayAlerts = 0doc = word.Documents.Open(FileName=file_path,ReadOnly=True, AddToRecentFiles=False)# 按段落(行)读取 + 清洗非法字符lines = []for p in doc.Paragraphs:line = p.Range.Text.strip()# 核心:清洗非法字符line = clean_text(line)if line: # 过滤空行lines.append(line)doc.Close(SaveChanges=False)word.Quit()return linesexcept Exception as e:print(f"读取失败:{file_path} => {str(e)}")return []finally:pythoncom.CoUninitialize()def main():data = []for root, _, files in os.walk(root_dir):for file in files:ext = file.lower()if not (ext.endswith(".doc") or ext.endswith(".docx")):continuefull_path = os.path.join(root, file)print("处理:", full_path)lines = read_doc_lines(full_path)if not lines:continue # 逐行存入数据for idx, line in enumerate(lines, 1):data.append({"文件名": file,"文件路径": full_path,"行号": idx,"内容": line}) # 导出 Exceldf = pd.DataFrame(data)df.to_excel(excel_out, index=False)print("\n✅ 全部完成!Excel 已保存到:", excel_out)if __name__ == "__main__":main()
完成截图如下:

上述代码将特殊字符在写入excel做了清理,所以不用担心你的路径和word名称有哪些乱七八糟的内容存在。
最后我提取出来的word内文章内容将近100百万行

,发现代码还是能把word的路径和word中每一页的内容全部提出在表格里面,


我只需要按关键字筛选出我要的内容,最后通过word的行列转置就达到了我们想要的效果。此时此刻心里,
提取的成果表格截图如下

第三步:最后优化代码,只提取我想要的内容
做数据处理的就是犟脾气,对结果还是不满意
主要原因是由于发现上述代码提取的内容太多后面我们,我们要仅提取表格中需要的内容,于是乎我们又做了代码优化


下述代码采用提取文本文件夹中指定文字(如①该宗地位于****,②受 XXX 委托,③用地总面积)内容。利用python的正则表达式的方法进行模糊查找,提取每份报告的乡镇、地址、姓名、面积等关键内容。
实现了批量抓取word中指定内容的目的。
具体python代码内容情况如下:
import osimport reimport pandas as pdimport win32com.client as win32# =========== 【改成你自己的路径】 ==========WORD_FOLDER = r"C:\父级文件夹目录"OUTPUT_EXCEL = r"C:\提取结果.xlsx"# =============================# 防闪退:捕获所有错误并打印try:word_app = win32.Dispatch("Word.Application")word_app.Visible = Falseword_app.DisplayAlerts = 0def extract(file_path):try:doc = word_app.Documents.Open(file_path, ReadOnly=True)text = doc.Content.Textdoc.Close(SaveChanges=False)# 1. 该宗地位于(完整保留,不删小地名)loc_match = re.search(r"该宗地位于\s*([^。\n]+)", text)# 2. 受 XXX 委托name_match = re.search(r"受\s*(.+?)\s*委托", text)# 3. 用地总面积(纯数字)area_match = re.search(r"用地总面积.*?(\d+)", text)location = loc_match.group(1).strip() if loc_match else "未提取"name = name_match.group(1).strip() if name_match else "未提取"area = area_match.group(1).strip() if area_match else "未提取"print(f"✅ {os.path.basename(file_path)} | {name} | {location} | {area}")return {"文件名": os.path.basename(file_path),"受委托姓名": name,"该宗地位于": location,"用地总面积": area}except Exception as e:print(f"❌ 读取失败:{file_path} | 错误:{e}")return {"文件名": os.path.basename(file_path),"受委托姓名": ","该宗地位于": "","用地总面积": ""}data = []for root, _, files in os.walk(WORD_FOLDER):for f in files:if f.lower().endswith((".doc", ".docx")) and not f.startswith("~$"):data.append(extract(os.path.join(root, f)))df = pd.DataFrame(data)df.to_excel(OUTPUT_EXCEL, index=False, engine="openpyxl")word_app.Quit()print("\n🎉 提取完成!按任意键关闭")except Exception as e:print(f"\n❌ 程序异常:{e}") # 防闪退:等待输入os.system("pause >nul")
最后通过代码完成作业表格内容如下:

温馨提示:
1.文件格式坑:python-docx只认.docx,.doc 格式会报错,建议先把老版.doc 转成.docx(用 Word 另存为就行),或者直接安装高版本word。
2.大文件夹坑:如果文件夹里有几百个 Word,耐心等一会儿,Python 会逐个处理,别中途关掉;
3.编码坑:在运行代码时候检查代码里的encoding="utf-8"有没有写对。
总结:
通过上述案例我们成功完成5000多分文字报告word内容的提取以及dwg在多级文件夹下的路径提取,最后通过利用vlookup函数分别查找2个excel表格的乡镇和姓名2个关键匹配字段,发现不一致的数据仅仅只有300多个,
针对这300多个存在的主要是有的文件夹下只有word报告没有dwg格式的数据,或者有只有dwg格式的数据没得word报告文档数据的存在。
同时上述案例,我们在利用arcgispro运行Python指定代码高效率的完成了领导交代的工作,再也不用对着套娃文件夹发呆,不用手动复制粘贴到手指酸,ArcGIS Pro Python 一键搞定,节约更多的人力和时间,摸鱼时间又多了!