比较位于两个具有相同键的不同词典中的 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