比较位于两个具有相同键的不同词典中的 shapefile 字段名称列表
Compare list of shapefile field names located in two separate dictionaries with same key
我创建了两个词典,d1 和 d2,它们都包含相同的键。键是 shapefile 的文件路径,例如:C:\TestFolder\Folder1\A\address_pt.shp.
此外,d1 的值是 shapefile 属性 table 中包含的字段名称列表。
下面是 d1 输出的例子:
{
'C:\TestFolder\Folder1\A\address_pt.shp': [
'FID', 'SHAPE', 'FULL_ADDRE', 'STREET_ADD', 'CITY_ST_ZI', 'PREFIX_DIR',
'HALF_ADDRE', 'HOUSE_NUMB', 'STREET_NAM', 'STREET_TYP', 'SUFFIX_DIR',
'UNIT_TYPE', 'UNIT_ID', 'CITY', 'STATE', 'ZIPCODE', 'PARCEL_NUM',
'PARCEL_N_1', 'HOUSE_NU_1', 'HOUSE_NU_2', 'STATUS', 'ASSEMBLY_S', 'SENATE',
'DISTRICT', 'COUNCIL', 'GRIDNUM', 'PHYSICAL_A', 'PUBDATE'
],
'C:\TestFolder\Folder1\B\ADDRESS_VALID_POINTS.shp': [
'FID', 'SHAPE', 'ADD_ID', 'HSE_NUMB', 'SNAM_PREMO', 'SNAM_PREDI', 'SNAME',
'SNAM_POSTY', 'SNAM_POSDI', 'SNAM_POSMO', 'FULL_STREE', 'SUB_ADD_TY',
'SUB_ADD_ID', 'FULL_ADDRE', 'PLACE_NAME', 'FNSB_COMM', 'FECC_COMM',
'ZIPCODE', 'ADD_TYPE', 'NOTES', 'STATUS', 'MS_EXCEPTI', 'NO_MSAG',
'GLOBALID', 'CREATED_US', 'CREATED_DA', 'LAST_EDITE', 'LAST_EDI_1'
],
'C:\TestFolder\Folder1\E\Public_Safety_Addresses.shp': [
'FID', 'SHAPE', 'OBJECTID', 'P_ID', 'ACCOUNT', 'TAXID_LOKI', 'ADRSNUM',
'P_ROADNME', 'ROADNME', 'S_ROADNME', 'PS_ROADNME', 'ADRSNUM_S', 'ZIP',
'LAT', 'LONG', 'ADDRESS', 'COMMUNITY', 'GLOBALID'
]
}
此外,d2 包含被认为包含在 shapefile 中的字段名称列表。以下是 d2 的示例。请注意,两个词典具有相同的键。
{
'C:\TestFolder\Folder1\A\address_pt.shp': [
'HOUSE_NUMB', 'HALF_ADDRE', 'PREFIX_DIR', 'STREET_NAM', 'STREET_TYP',
'SUFFIX_DIR', 'UNIT_TYPE', 'UNIT_ID', ' BUILDINGA', 'STREET_ADD', 'CITY',
'STATE', 'ZIPCODE'
],
'C:\TestFolder\Folder1\B\ADDRESS_VALID_POINTS.shp': [
'HSE_NUMB', ' PRETYPEA', 'FULL_STREE', 'SUB_ADD_TY', 'SUB_ADD_ID', 'ZIPCODE'
],
'C:\TestFolder\Folder1\E\Public_Safety_Addresses.shp': [
' TYPEA', 'OBJECTID', 'ADRSNUM', 'P_ROADNME', 'ROADNME', 'S_ROADNME',
'ADRSNUM_S', 'ADDRESS', 'COMMUNITY', 'ZIP'
]
}
我的目标是使用 d2 中的字段名称列表并搜索 d1 以查看 d2 中的字段名称是否存在于 d1 中。我想创建两个具有相同键的新词典,newd1 将包含找到的字段名称,newd2 将包含未找到的字段名称。
此外,我想捕获搜索结果并将结果输入到两个新的空白字段中。第一个字段将被命名为类似 field_found 的名称,并包括在两个词典中找到的匹配字段。第二个字段将被命名为类似于 fields_not_found 并且包括来自 dictionarytwo 而在 dictionaryone.
中找不到的字段
我不确定这个过程是否可行,我无法弄清楚代码逻辑。我不确定使用字典是否是最好的方法。下面是我目前拥有的代码,它创建了两个字典。
import arcpy
#Define the Workspace
arcpy.env.workspace = r"C:\TestFolder"
dbf1 = "APExistOnlyEdit.dbf"
myfield = "FI_PATH"
filepathlist2 =[row[0] for row in arcpy.da.SearchCursor(dbf1,myfield)]
#print(filepathlist2)
#Dictionary one holding Field Names that are within Shapefile
d1 = {}
for thisFile in filepathlist2:
ContainedFieldNames = [f.name.upper() for f in arcpy.ListFields(thisFile)]
d1[thisFile] = ContainedFieldNames
print(d1)
#Dictionary two holding Field Names that are thought to be in Shapefile
d2 = {}
with arcpy.da.SearchCursor(dbf1, [
myfield,'AP_FIPS','AP_BLDGCOM','AP_TYPE','AP_STATUS','AP_ID','AP_HOUSENU',
'AP_HALFADD', 'AP_PREDIR','AP_PRETYPE','AP_STNAME','AP_SUFTYPE','AP_SUFDIR',
'AP_UNITTYP','AP_UNIT','AP_BUILDIN','AP_FULLADD','AP_CITY','AP_STATE','AP_ZIP'
]) as rows:
for row in rows:
d2[row[0]] = [a.upper() for a in row[1:] if a.strip() != '']
print(d2)
可以这样做:
for filepath in d1:
newd2 = [attribute for attribute in d1.filepath if attribute not in d2.filepath]
newd1 = [attribute for attribute in d2.filepath if attribute not in d1.filepath]
# Do something with new & old attributes
我创建了两个词典,d1 和 d2,它们都包含相同的键。键是 shapefile 的文件路径,例如:C:\TestFolder\Folder1\A\address_pt.shp.
此外,d1 的值是 shapefile 属性 table 中包含的字段名称列表。
下面是 d1 输出的例子:
{
'C:\TestFolder\Folder1\A\address_pt.shp': [
'FID', 'SHAPE', 'FULL_ADDRE', 'STREET_ADD', 'CITY_ST_ZI', 'PREFIX_DIR',
'HALF_ADDRE', 'HOUSE_NUMB', 'STREET_NAM', 'STREET_TYP', 'SUFFIX_DIR',
'UNIT_TYPE', 'UNIT_ID', 'CITY', 'STATE', 'ZIPCODE', 'PARCEL_NUM',
'PARCEL_N_1', 'HOUSE_NU_1', 'HOUSE_NU_2', 'STATUS', 'ASSEMBLY_S', 'SENATE',
'DISTRICT', 'COUNCIL', 'GRIDNUM', 'PHYSICAL_A', 'PUBDATE'
],
'C:\TestFolder\Folder1\B\ADDRESS_VALID_POINTS.shp': [
'FID', 'SHAPE', 'ADD_ID', 'HSE_NUMB', 'SNAM_PREMO', 'SNAM_PREDI', 'SNAME',
'SNAM_POSTY', 'SNAM_POSDI', 'SNAM_POSMO', 'FULL_STREE', 'SUB_ADD_TY',
'SUB_ADD_ID', 'FULL_ADDRE', 'PLACE_NAME', 'FNSB_COMM', 'FECC_COMM',
'ZIPCODE', 'ADD_TYPE', 'NOTES', 'STATUS', 'MS_EXCEPTI', 'NO_MSAG',
'GLOBALID', 'CREATED_US', 'CREATED_DA', 'LAST_EDITE', 'LAST_EDI_1'
],
'C:\TestFolder\Folder1\E\Public_Safety_Addresses.shp': [
'FID', 'SHAPE', 'OBJECTID', 'P_ID', 'ACCOUNT', 'TAXID_LOKI', 'ADRSNUM',
'P_ROADNME', 'ROADNME', 'S_ROADNME', 'PS_ROADNME', 'ADRSNUM_S', 'ZIP',
'LAT', 'LONG', 'ADDRESS', 'COMMUNITY', 'GLOBALID'
]
}
此外,d2 包含被认为包含在 shapefile 中的字段名称列表。以下是 d2 的示例。请注意,两个词典具有相同的键。
{
'C:\TestFolder\Folder1\A\address_pt.shp': [
'HOUSE_NUMB', 'HALF_ADDRE', 'PREFIX_DIR', 'STREET_NAM', 'STREET_TYP',
'SUFFIX_DIR', 'UNIT_TYPE', 'UNIT_ID', ' BUILDINGA', 'STREET_ADD', 'CITY',
'STATE', 'ZIPCODE'
],
'C:\TestFolder\Folder1\B\ADDRESS_VALID_POINTS.shp': [
'HSE_NUMB', ' PRETYPEA', 'FULL_STREE', 'SUB_ADD_TY', 'SUB_ADD_ID', 'ZIPCODE'
],
'C:\TestFolder\Folder1\E\Public_Safety_Addresses.shp': [
' TYPEA', 'OBJECTID', 'ADRSNUM', 'P_ROADNME', 'ROADNME', 'S_ROADNME',
'ADRSNUM_S', 'ADDRESS', 'COMMUNITY', 'ZIP'
]
}
我的目标是使用 d2 中的字段名称列表并搜索 d1 以查看 d2 中的字段名称是否存在于 d1 中。我想创建两个具有相同键的新词典,newd1 将包含找到的字段名称,newd2 将包含未找到的字段名称。
此外,我想捕获搜索结果并将结果输入到两个新的空白字段中。第一个字段将被命名为类似 field_found 的名称,并包括在两个词典中找到的匹配字段。第二个字段将被命名为类似于 fields_not_found 并且包括来自 dictionarytwo 而在 dictionaryone.
中找不到的字段我不确定这个过程是否可行,我无法弄清楚代码逻辑。我不确定使用字典是否是最好的方法。下面是我目前拥有的代码,它创建了两个字典。
import arcpy
#Define the Workspace
arcpy.env.workspace = r"C:\TestFolder"
dbf1 = "APExistOnlyEdit.dbf"
myfield = "FI_PATH"
filepathlist2 =[row[0] for row in arcpy.da.SearchCursor(dbf1,myfield)]
#print(filepathlist2)
#Dictionary one holding Field Names that are within Shapefile
d1 = {}
for thisFile in filepathlist2:
ContainedFieldNames = [f.name.upper() for f in arcpy.ListFields(thisFile)]
d1[thisFile] = ContainedFieldNames
print(d1)
#Dictionary two holding Field Names that are thought to be in Shapefile
d2 = {}
with arcpy.da.SearchCursor(dbf1, [
myfield,'AP_FIPS','AP_BLDGCOM','AP_TYPE','AP_STATUS','AP_ID','AP_HOUSENU',
'AP_HALFADD', 'AP_PREDIR','AP_PRETYPE','AP_STNAME','AP_SUFTYPE','AP_SUFDIR',
'AP_UNITTYP','AP_UNIT','AP_BUILDIN','AP_FULLADD','AP_CITY','AP_STATE','AP_ZIP'
]) as rows:
for row in rows:
d2[row[0]] = [a.upper() for a in row[1:] if a.strip() != '']
print(d2)
可以这样做:
for filepath in d1:
newd2 = [attribute for attribute in d1.filepath if attribute not in d2.filepath]
newd1 = [attribute for attribute in d2.filepath if attribute not in d1.filepath]
# Do something with new & old attributes