当前位置:首页>python>在ArcGIS Pro中利用Python语言提前多层文件夹下的dwg路径和 Word 内容的方法

在ArcGIS Pro中利用Python语言提前多层文件夹下的dwg路径和 Word 内容的方法

  • 2026-09-02 18:54:45
在ArcGIS Pro中利用Python语言提前多层文件夹下的dwg路径和 Word 内容的方法

哈喽各位小伙伴们!

你们在说数据处理分析时候是不是也会烦恼,数据量大,时间紧,完不成任务。

下面给小伙伴们讲一个我们亲自遇到的案例时间:

一、前言

前段时间快下班了,接到一个复杂的任务,。

领导甩来一个文件夹,这个文件夹里面跟套娃似的,叠了 N 层子文件夹N个子文件夹下还有N个文件夹,最后一级文件下有如下内容:

1.Word文档的命名不规则,路径和命名还有特殊字符,格式有的的doc有的是docx格式的,其中word文档内容中包含文字说明、表格,有的表格中插入了照片,文档内容包含多页。

2. dwg格式的数据统一命名不规则,包含多个dwg,有的是dxf,有的是dwg,并且dwg打开版本还不一样,有的是2008版,有的是2018版,命名不规范数据很乱。

3.其他数据(包括excel、shp数据、bak格式的数据、xml格式的数据)等。

二、案例说明

 领导的需求是将这个文件夹下的所有word里的这些内容全扒出来整理成表格,同时把这个文件夹下的dwg格式的路径全部提取到表格里面,由于这个“父”文件夹下,有很多个“子”文件夹,子文件夹下还有很多“孙子”文件夹,甚至“孙子”文件夹下还有很多“重孙子”文件夹。反正文件夹的命名出了子文件夹下是按年度命名的,剩下后面的文件很乱,有特殊符号、有数字开头等情况,唯一一致的就是最后一级的文件夹下的.dwg和.doc(包含docx)是放在一起的。看着这些成果我们当时崩溃至极,具体内心心里如下:

领导要求最终提交表格部分内容如下所示:

年度

乡镇

地址

姓名

面积

备注

1.按年度在word报告中提取表格中的内容;

2.将dwg格式的路径提取出来;

3.最后按word报告中的姓名命名该文件夹下dwg格式数据同时命名成一致的。

我初步筛选了下,这个文件夹包括将近5000多个word(格式有doc和docx)和8000多个dwg。

你们遇到这种情况,是不是马上崩溃!!!拉上三五个小伙伴手动复制粘贴,重命名弄到天黑都搞不完!最少搞3天吧

如果你们也有遇到过类似的情况,

别慌!今天就教你们用 ArcGIS Pro 里的 Python,当一回 “文件夹拆迁队”+“Word 内容挖掘机”,不管多少层子文件夹、Word 里有图有表有文字,一键给你扒得明明白白,效率直接拉满!

老规矩,开始之前先放手轻松欢快的歌曲,放松下。

话不多说,直接开干。

任务1:抓取所有的dwg格式的路径

第一步:安装第三方库openpyxl

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

具体方法可查询前面我写过的文章。我之前写过的文章哟。

ArcGIS Pro Python小白爆笑教程第三方库安装+矢量表格自动化,看完再也不秃头!

第二步:利用python递归遍历文件夹抓取所有.dwg路径 逐行写入Excel。

代码解释:通过递归遍历主文件夹所有子目录,对目录下的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/.dwg        if 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 = False        word.DisplayAlerts = 0        doc = 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 lines    except 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")):                continue            full_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})    # 导出 Excel    df = 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 = False    word_app.DisplayAlerts = 0    def extract(file_path):        try:            doc = word_app.Documents.Open(file_path, ReadOnly=True)            text = doc.Content.Text            doc.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 一键搞定,节约更多的人力和时间,摸鱼时间又多了!

如果这篇文章对小伙伴们~有帮助,欢迎点赞、收藏,点击小爱心哟。

同时转发给身边的GISer小伙伴~ 

有任何疑问,或者想了解更多的ArcGIS pro技巧,都可以在评论区留言,我们一起相互帮助的学习和交流。

后续我们将继续分享实战经验,让更多的小伙伴~在使用区软件方面收获满满,记得点击上方关注我们哟!

另外后台私信我们,小伙伴们能获取很多相关测绘地理信息的软件和规范,同时可以加交流群,获取更多软件技能知识。

最后插播一个商品,我也买了这本书,感觉对学习有挺大的帮助,有小伙伴喜欢的可以购买哟。

最新文章

随机文章