求Python脚本:从N盘多文件夹提取最新.geojson用于ArcGIS Pro批量导入
从多子文件夹提取最新GeoJSON并集中的Python脚本
你需要的脚本要实现遍历N盘所有子文件夹、每个文件夹只保留最新创建的GeoJSON、集中复制到指定目录,原脚本没有处理“同一位置取最新”的逻辑,下面是修改后的完整脚本,以及针对零基础的逐行讲解:
import os from shutil import copyfile # ---------------------- 这里需要你修改成自己的路径 ---------------------- # N盘的根目录(要搜索的起始文件夹) n_drive_path = r"N:\" # 要集中存放文件的目标目录 out_folder = r"C:\GeoJSON_集中目录" # ---------------------------------------------------------------------- # 用字典存每个文件夹下的GeoJSON文件,键是文件夹路径,值是该文件夹下的所有GeoJSON文件信息 folder_geojsons = {} # 遍历N盘下所有文件夹和文件 for root, _, files in os.walk(n_drive_path): for file in files: # 只处理.geojson后缀的文件(不区分大小写) if file.lower().endswith(".geojson"): file_full_path = os.path.join(root, file) # 获取文件的创建时间(Windows系统用getctime,Linux/macOS若要修改时间可换getmtime) create_time = os.path.getctime(file_full_path) # 如果这个文件夹还没在字典里,先初始化空列表 if root not in folder_geojsons: folder_geojsons[root] = [] # 把(创建时间,文件全路径)添加到对应文件夹的列表中 folder_geojsons[root].append( (create_time, file_full_path) ) # 确保目标目录存在,不存在则自动创建 if not os.path.exists(out_folder): os.makedirs(out_folder) # 遍历每个文件夹的GeoJSON列表,选择最新的文件复制到目标目录 for folder, file_list in folder_geojsons.items(): # 按创建时间倒序排序,第一个就是最新文件 file_list.sort(reverse=True, key=lambda x: x[0]) latest_file = file_list[0][1] # 提取文件名(若要避免不同文件夹重名覆盖,可看下方额外说明) file_name = os.path.basename(latest_file) target_path = os.path.join(out_folder, file_name) # 执行复制操作 copyfile(latest_file, target_path) print(f"已复制最新文件:{latest_file} -> {target_path}")
脚本逐行通俗讲解
1. 导入必备工具包
import os from shutil import copyfile
os是Python自带的文件/文件夹操作工具,用来找文件、查看文件时间、创建文件夹等copyfile是专门用来复制文件的工具,直接从shutil工具包中调用即可
2. 设置自定义路径(你需要修改的部分)
n_drive_path = r"N:\" out_folder = r"C:\GeoJSON_集中目录"
- 字符串前加
r是告诉Python这是原始路径,不用处理路径里的反斜杠转义,直接写你实际的文件夹路径就行 - 把
N:\"改成你要搜索的N盘起始文件夹(比如N:\项目调研数据\),把目标目录改成你要集中存放文件的文件夹
3. 初始化“文件夹账本”
folder_geojsons = {}
- 字典就像一个分类账本,每个键对应一个文件夹路径,值是该文件夹下所有GeoJSON的「创建时间+文件路径」信息,方便后续筛选每个文件夹的最新文件
4. 遍历所有文件夹找GeoJSON
for root, _, files in os.walk(n_drive_path): for file in files: if file.lower().endswith(".geojson"): file_full_path = os.path.join(root, file) create_time = os.path.getctime(file_full_path) if root not in folder_geojsons: folder_geojsons[root] = [] folder_geojsons[root].append( (create_time, file_full_path) )
os.walk(n_drive_path)会自动遍历N盘下的所有子文件夹,root是当前遍历到的文件夹路径,files是该文件夹下的所有文件file.lower().endswith(".geojson"):不管文件名是.GeoJSON还是.GEOJSON,都能识别为GeoJSON文件os.path.getctime(file_full_path):获取文件的创建时间(Windows系统适用,Linux/macOS若要取修改时间可换成os.path.getmtime)- 把每个GeoJSON的创建时间和完整路径,存入对应文件夹的账本条目里
5. 确保目标目录存在
if not os.path.exists(out_folder): os.makedirs(out_folder)
- 如果你设置的目标目录还没创建,Python会自动帮你生成,避免复制文件时因目录不存在报错
6. 筛选最新文件并复制
for folder, file_list in folder_geojsons.items(): file_list.sort(reverse=True, key=lambda x: x[0]) latest_file = file_list[0][1] file_name = os.path.basename(latest_file) target_path = os.path.join(out_folder, file_name) copyfile(latest_file, target_path) print(f"已复制最新文件:{latest_file} -> {target_path}")
- 遍历账本里的每个文件夹条目
file_list.sort(reverse=True, key=lambda x: x[0]):把当前文件夹的GeoJSON按创建时间从新到旧排序,第一个就是最新的文件latest_file = file_list[0][1]:取排序后的第一个文件的完整路径os.path.basename(latest_file):提取文件名(比如N:\A\点位数据.geojson会提取成点位数据.geojson)copyfile(...):执行复制操作,print会输出复制记录,方便你核对
额外注意:避免不同文件夹文件重名覆盖
如果不同文件夹有同名的GeoJSON,原逻辑会覆盖旧文件。若要保留所有文件,可把提取文件名的代码改成:
# 用文件夹名+原文件名命名,避免重名 folder_short_name = os.path.basename(folder) file_name = f"{folder_short_name}_{os.path.basename(latest_file)}"
内容的提问来源于stack exchange,提问作者spatialuser201235
相关产品推荐
相关产品推荐

