Как проверить наличие пустых значений в полях * множественных * файлов форм? - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть одна основная папка, и она имеет несколько подпапок. Каждая подпапка имеет один шейп-файл. Я хочу проверить все поля файла формы, которые имеют нулевые значения. Если в файлах формы есть нулевые значения, то выведите имя файла формы вместе с именем поля.

Я нашел код, но он работает только для одного файла формы.

import arcpy
fc = r'C:\Y4YK\Muni'
fields = dict((f.name, []) for f in arcpy.ListFields(fc) if not f.required)

rows = arcpy.SearchCursor(fc,"","","","")
for row in rows:
    for f in fields.keys():
        fields[f].append(row.getValue(f))

    for field, values in fields.iteritems():
        if any(map(lambda s: s is None or not str(s).strip(), values)):
            print 'Field: "{}" has empty values'.format(field)

1 Ответ

0 голосов
/ 04 апреля 2020

Я думаю, что сначала нужно быстрее проверить с помощью запроса sql, если в какой-либо строке есть значения None, прежде чем читать каждую строку с помощью курсора (кстати, используйте курсоры доступа к данным (da.SearchCursor), они намного быстрее) ,

Попробуйте:

import arcpy, os

arcpy.env.overwriteOutput = True #To be able to use same layer name in MakeFeatureLayer

shapefolder = r'C:\GIS\data\testdata'

for path, subdirs, files in os.walk(shapefolder):
    for name in files:
        if name.endswith('.shp'):
            shapefile = os.path.join(path,name)
            fields_to_check = [f.name for f in arcpy.ListFields(shapefile) if not f.required]

            sql = ' OR '.join([field+" IS NULL" for field in fields_to_check]) #Construct sql query like: 'Field1 IS NULL OR Field2 IS NULL OR ...'
            arcpy.MakeFeatureLayer_management(in_features=shapefile, out_layer='layer', where_clause=sql) #Use the sql clause to create a temporary layer

            shapefile_row_count = int(arcpy.GetCount_management(in_rows=shapefile).getOutput(0))
            if int(arcpy.GetCount_management(in_rows='layer').getOutput(0)) >= shapefile_row_count and shapefile_row_count >0: #Check if row number returned by query are >= to shapefile row count
                nonefields = []
                with arcpy.da.SearchCursor('layer', fields_to_check) as cursor:
                    for row in cursor:
                        if None in row:
                            nones = [fields_to_check[j] for j in [i for i in range(len(row)) if row[i] is None]]
                            nonefields.extend(nones)
                nonefields = ', '.join(sorted(list(set(nonefields))))
                print 'None value(s) in shapefile: {}, field(s): {}'.format(shapefile, nonefields)

Должно вывести что-то вроде:

None value(s) in shapefile: C:\GIS\data\testdata\intertest.shp, field(s): fieldname1, fieldname2, fieldname10
None value(s) in shapefile: C:\GIS\data\testdata\polygons.shp, field(s): blabla, blablabla
...