Сравните список имен полей шейп-файлов, расположенных в двух отдельных словарях с одинаковым ключом - PullRequest
0 голосов
/ 28 января 2020

Я создал два словаря, d1 и d2, и оба содержат один и тот же ключ. Ключом является путь к файлу шейп-файла, например: C:\TestFolder\Folder1\A\address_pt.shp. Кроме того, d1 имеет значения, которые представляют собой списки имен полей, содержащихся в таблице атрибутов шейп-файла.

Ниже приведен пример вывода 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 содержит список имен полей, которые, как считается, находятся в шейп-файле. Ниже приведен пример 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.

Я не уверен, что этот процесс возможен, и я не могу понять код logi c. Я не уверен, что использование словарей - лучший подход. Ниже приведен код, который у меня есть на данный момент, и он создает оба словаря.

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)

1 Ответ

0 голосов
/ 30 января 2020

Может сделать что-то вроде:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...