ArcPy를 사용하여 동일한 문자로 시작하는 파일 병합
Aug 20 2020
아래와 같은 2 개의 문자 로 시작하는 파일을 병합하려고 합니다.
- 11111-병합 (출력 이름 : 11.shp)
- 11112-병합 (출력 이름 : 11.shp)
- 11113-병합 (출력 이름 : 11.shp)
- 22112-병합 (출력 이름 : 22.shp)
- 22153-병합 (출력 이름 : 22.shp)
그러나 "11"이 파일 이름에 포함되면 (예 : 4)) 내 파이썬 스크립트의 결과가 병합됩니다. 11 ***. shp (1) ~ 3) 만 원하지만 A Script는 11 .shp를 병합합니다 (1 ~ 4를 11.shp로 병합).
================================================ ======================
import sys, os, arcpy, fnmatch
reload(sys)
arcpy.env.workspace = r"F:\a"
workspace = arcpy.env.workspace
outdir = r"F:\b"
List = []
for dirpath, dirnames, filenames in os.walk(workspace, topdown=True):
for filename in filenames:
List.append(os.path.join(dirpath, filename))
break
patterns = set([os.path.basename(fl)[:2] for fl in List])
for pattern in patterns:
group = [fl for fl in List if fnmatch.fnmatchcase(fl, '*' + pattern + '*.shp')]
output = os.path.join(outdir, pattern)
arcpy.Merge_management(group, output)
================================================ ======================
어떻게 고칠 수 있습니까?
답변
2 BERA Aug 20 2020 at 14:58
나는 collections.defaultdict (list) 좋아 한다 .
... 키-값 쌍의 시퀀스를 목록 사전으로 그룹화
예:
import arcpy, os
from collections import defaultdict as dd
folder = r'C:\GIS\data\testdata\merge'
out_folder = r'C:\GIS\data\testdata\outfolder'
d = dd(list)
for item in os.listdir(folder):
if os.path.isfile(os.path.join(folder,item)) and file.endswith('.shp'):
d[item[:2]].append(os.path.join(folder, item))
#Execute code above then print(d) to make sure its ok before merging
for group, mergelist in d.items():
#print(group, mergelist)
arcpy.Merge_management(inputs=mergelist, output=os.path.join(out_folder, 'Merge_{}.shp'.format(group)))
하위 디렉토리도 검색하려면 시도한 것처럼 os.walk를 사용하십시오. 예 :
import os
from collections import defaultdict as dd
folder_main = r'C:\GIS\data\testdata'
d = dd(list)
for root, folder, files in os.walk(folder_main):
for file in files:
if os.path.isfile(os.path.join(root, file)) and file.endswith('.shp'):
print(file)
d[file[:2]].append(os.path.join(root, file))