ArcGIS Online や Portal for ArGIS にコンピューター上のファイルをアイテムとして登録する際は、サイトにつきユニークなファイル名でなければいけません。
例えば、Vricon 3D という製品の i3s (*.spk) ファイルは、ポータルから登録するアップローダーのファイルサイズ上限がある関係で、購入範囲がタイル上に分割されています。分割された地域はフォルダーに分類されますが、i3s ファイルはすべて同じ「vricon_i3s.spk」というファイル名になります。そこで、このファイルをユニークな名称にバッチ処理する方法を考えました。
以下のコードを実行することで、自動的にフォルダー名を元にファイルをリネームします。タイル分割されたファイルはフォルダーでユニークな番号で連番されるのですが、連番は0で桁埋めされていないため、それも考慮しています。
#coding:cp932
#Vricon 3D i3s ファイルをリネームしてディレクトリに再配置
#例
# XXXXXXXXXXXXX = 地域を分割するためのユニークな名称
# YYY = タイル分割を示す
#元のファイル(例)
# D:\theFolder\XXXXXXXXXXXXX\vricon_3d_surface_model_i3s\pYYY\vricon_3d_surface_model_i3s\data\vricon_i3s.spk
#移動先(例)
# D:\theFolder\XXXXXXXXXXXXX\vricon_3d_surface_model_i3s\vricon_i3s_XXXXXXXXXXXXX_pYYY.spk
#パラメーター
#検索ディレクトリー
input_dir = r"D:\theFolder\XXXXXXXXXXXXX\vricon_3d_surface_model_i3s"
#対象拡張子
input_ext = ".spk"
#出力フォルダー
output_dir = input_dir
#出力ファイルの接頭辞
output_prefix = "vricon_i3s"
#地域の分類を示すフォルダー階層
dir_region = 2
#タイルの分割を示すフォルダー階層
dir_tile = 4
#タイル分割フォルダーの接頭辞
tile_prefix = "p"
#タイル番号0埋め桁数
zerofill = 3
import os
import shutil
#再帰的に指定フォルダー以下のファイルを取得する関数
def find_all_files(directory):
for root, dirs, files in os.walk(directory):
yield root
for file in files:
yield os.path.join(root, file)
#処理
for file in find_all_files(input_dir):
base, ext = os.path.splitext(file)
if ext = input_ext:
dirs = file.split('\\') #ディレクトリーをリストに分割
region_no = dirs[dir_region]
#タイル番号0埋め
number = dirs[dir_tile].lstrip(tile_prefix)
number = prefix + number.zfill(zerofill)
#ファイル移動
dst = "{0}\\{1}_{2}_{3}{4}".format(output_dir, output_prefix, region_no, input_ext)
shutil.move(file, dst)
print("Done !")


