2015-12-03 3 views
0

Для моей работы мне пришлось написать скрипт python для создания нескольких карт, показывающих похожие данные для разных школ. Я использую курсор для прокрутки списка, и это действительно хорошо работает для первых 28 школ в моем списке. Однако затем я получаю сообщение об ошибке при экспорте следующей карты в файл pdf.Python перестает перебираться через список после некоторых итераций

AttributeError: PageLayoutObject: Error in executing ExportToPDF

Я также попытался экспортировать карту только в файл jpeg, который работает немного дольше, но также останавливается после ок. 50 итераций с той же ошибкой.

Я понятия не имею, почему мой скрипт работает на первые 28 итераций и останавливается тогда. У кого-нибудь есть идея? Может быть, Python не может сохранить так много файлов в папку, на которую я направляю? Или память заполняется или что-то еще? Что я могу сделать против этого?

Я довольно новичок в программировании на Python в целом, так что я не знаю, как решить эту проблему.

Вот часть моего кода (который может помочь):

Начало с initilizing Курсор:

Schulliste = "filepath/Schulliste_PrSt.csv" 
fields = ('Schule_Nr', 'Schule_Name') 
CursorSchule = arcpy.da.SearchCursor(Schulliste, fields) 
for row in CursorSchule: 
*[a lot of tasks to set up the map]* 

конец кода, чтобы сохранить карты как PDF и Jpeg файла:

# Karte exportieren 
if SF == "STS": 
    arcpy.mapping.ExportToPDF(mapdoc, "filepath/Einzugsgebiet_{0}.pdf".format(row[0])) 
    arcpy.mapping.ExportToJPEG(mapdoc, "filepath/Einzugsgebiet_{0}.jpg".format(row[0])) 
elif SF == "G": 
    arcpy.mapping.ExportToPDF(mapdoc, "filepath/Einzugsgebiet_{0}.pdf".format(row[0])) 
    arcpy.mapping.ExportToJPEG(mapdoc, "filepath/Einzugsgebiet_{0}.jpg".format(row[0])) 

общий код Loop:

for row in CursorSchule: 
    #define mapdoc and dataframes 
    mxd = "filepath/Standard_Einzug.mxd" 
    mapdoc = arcpy.mapping.MapDocument(mxd) 
    df = arcpy.mapping.ListDataFrames(mapdoc)[0] 
    df_Sus = arcpy.mapping.ListDataFrames(mapdoc)[1] 


    #define new layers 
    lyrSchule = arcpy.mapping.Layer("filepath/FHH_Schulen_SJST_2014_SingleSym_red.lyr") 
    lyrNachbarsch = arcpy.mapping.Layer("filepath/FHH_Schulen_SJST_2014_SingleSym_blue.lyr") 
    lyrEinzug = arcpy.mapping.Layer("filepath/FHH_StatGeb_2011_GradCol.lyr") 

    #define legends 
    legend1 = arcpy.mapping.ListLayoutElements(mapdoc, "LEGEND_ELEMENT", "Legende1")[0] 
    legend2 = arcpy.mapping.ListLayoutElements(mapdoc, "LEGEND_ELEMENT", "Legende2")[0] 

    #add table for every School with table join 
    folder = "filepath/" 
    joinTable = join(folder, "Daten_{0}.csv".format(row[0])) 
    arcpy.AddJoin_management(lyrEinzug, "StatGeb_Nr", joinTable, "StatGeb_Nr") 
    arcpy.FeatureClassToShapefile_conversion(lyrEinzug, "filepath") 

    #add saved shapefile 
    lyrEinzug = arcpy.mapping.Layer("GPL0.shp") 
    legend1.autoAdd = False 
    legend2.autoAdd = True 
    arcpy.mapping.AddLayer(df, lyrEinzug) 
    for lyr in arcpy.mapping.ListLayers(mapdoc): 
     if lyr.name == "GPL0": 
      lyr.name = "Gebietsbezogen" 

    #Change symbology of the layer to graduated Color 
    lyrEinzug = arcpy.mapping.ListLayers(mapdoc, "Gebietsbezogen")[0] 
    sourceLayer = arcpy.mapping.Layer("filepath/StatGeb_Label_Halo_Symbol.lyr") 
    arcpy.mapping.UpdateLayer(df, lyrEinzug, sourceLayer, False) 
    arcpy.RefreshActiveView() 
    lyrEinzug = arcpy.mapping.ListLayers(mapdoc, "Gebietsbezogen")[0] 

    #Change symbology classes 
    fieldlist = arcpy.ListFields("filepath/GPL0.shp") 
    valueField = fieldlist[-1] 
    lyrEinzug.symbology.valueField = valueField.name 
    lyrEinzug.symbology.classBreakValues = [0, 5, 10, 20, 40, 70, 100] 
    lyrEinzug.symbology.classBreakLabels = ["unter 5% der SuS", "5 bis unter 10% der SuS", "10 bis unter 20% der SuS", "20 bis unter 40% der SuS", "40 bis unter 70% der SuS", "über 70% der SuS"] 
    lyrEinzug.transparency = 50 

    #Data Frame Extent 
    queryField = fieldlist[7] 
    fieldname = queryField.name 
    delimfield = arcpy.AddFieldDelimiters(lyrEinzug, fieldname) 
    attribute_query = delimfield + " = {0}".format(row[0]) 
    lyrEinzug.definitionQuery = attribute_query 
    df.extent = lyrEinzug.getSelectedExtent(False) 
    arcpy.RefreshActiveView() 

    #add labels 
    labelField = fieldlist[9] 
    if lyrEinzug.supports("LABELCLASSES"): 
     for lblclass in lyrEinzug.labelClasses: 
      lblclass.showClassLabels = True 
    lblclass.expression = "\"<FNT name='Arial' size='3'><CLR green = '112' blue = '255'>\"" + " & [" + labelField.name + "] & " + '"</CLR></FNT>"' 
    lyrEinzug.showLabels = True 
    arcpy.RefreshActiveView() 

    #select specific school 
    fieldSchule = "Schule_Nr" 
    delimfieldSchule = arcpy.AddFieldDelimiters(lyrSchule, fieldSchule) 
    querySchule = delimfieldSchule + " = {0}".format(row[0]) 
    lyrSchule.definitionQuery = querySchule 
    arcpy.FeatureClassToShapefile_conversion(lyrSchule, "filepath/02_GIS-Daten") 
    lyrSchule = arcpy.mapping.Layer("GPL0_1.shp") 
    legend1.autoAdd = True 
    legend2.autoAdd = False 
    arcpy.mapping.AddLayer(df, lyrSchule, "TOP") 
    lyrSchule = arcpy.mapping.ListLayers(mapdoc, "GPL*")[0] 
    sourceLayer = arcpy.mapping.Layer("filepath/Schule_Labels_Halo.lyr") 
    arcpy.mapping.UpdateLayer(df, lyrSchule, sourceLayer, False) 
    lyrSchule.name = "{0} ({1})".format(row[1], row[0]) 

    if lyrSchule.supports("LABELCLASSES"): 
     for lblclass in lyrSchule.labelClasses: 
      lblclass.showClassLabels = True 
      lblclass.expression = '"%s" & [Schule_Nam] & "%s"' % ("<BOL><FNT name='Arial' size='3'><CLR red = '255'>", "</CLR></FNT></BOL>") 
    lyrSchule.showLabels = True 
    arcpy.RefreshActiveView() 

    #select neighboring Schools within 1.5 km 
    arcpy.Buffer_analysis("filepath/buffer", 1500) 
    lyrBuffer = arcpy.mapping.Layer("buffer.shp") 
    arcpy.SelectLayerByLocation_management(lyrNachbarsch, "WITHIN", lyrBuffer) 
    arcpy.FeatureClassToShapefile_conversion(lyrNachbarsch, "filepath") 
    lyrNachbarsch = arcpy.mapping.Layer("filepath/GPL0_2.shp") 
    legend1.autoAdd = True 
    legend2.autoAdd = False 
    arcpy.mapping.InsertLayer(df, lyrSchule, lyrNachbarsch, "AFTER") 
    for lyr in arcpy.mapping.ListLayers(mapdoc): 
     if lyr.name == "GPL0_2": 
      lyr.name = "Nachbarschulen (<1,5km)" 
    lyrNachbarsch = arcpy.mapping.ListLayers(mapdoc, "Nachbar*")[0] 
    sourceLayer = arcpy.mapping.Layer("filepath/FHH_Schulen_SJST_2014_SingleSym_blue.lyr") 
    arcpy.mapping.UpdateLayer(df, lyrNachbarsch, sourceLayer, True) 

    #if selected School is elementary School, also only select neighbouring elementary Schools 
    SC = arcpy.SearchCursor(lyrSchule) 
    for Schule in SC: 
     SF = Schule.getValue("Schule_SF") 
    fieldform = "Schule_SF" 
    delimfield1 = arcpy.AddFieldDelimiters(lyrNachbarsch, fieldform) 
    query_SF = delimfield1 + "= 'G'" 
    lyrNachbarsch.definitionQuery = query_SF 
    arcpy.RefreshActiveView() 

    del SC, Schule 

    #Labels for schools 
    fieldname = "Schule_Nr" 
    delimfield2 = arcpy.AddFieldDelimiters(lyrNachbarsch, fieldname) 
    query_Nachbar = delimfield2 + "<> {0}".format(row[0]) 
    if lyrNachbarsch.supports("LABELCLASSES"): 
     for lblclass in lyrNachbarsch.labelClasses: 
      lblclass.className = "Schulname" 
      lblclass.SQLQuery = query_Nachbar 
      lblclass.expression = '"%s" & [Schule_Nam] & "%s"' % ("<FNT name='Arial' size='3'><CLR red = '100' blue = '100' green = '100'>", "</CLR></FNT>") 
      lblclass.showClassLabels = True 
    lyrNachbarsch.showLabels = True 
    arcpy.RefreshActiveView() 

    #Change text 
    #Titel 
    Titel = arcpy.mapping.ListLayoutElements(mapdoc, "TEXT_ELEMENT", "Titel")[0] 
    Titel.text = "Einzugsgebiet Jahrgänge 1-4" 

    #Legende 
    style_StatGeb = arcpy.mapping.ListStyleItems("USER_STYLE", "Legend Items", "Einzug")[0] 
    style_Schulen = arcpy.mapping.ListStyleItems("USER_STYLE", "Legend Items", "Schule")[0] 
    legend1.updateItem(lyrSchule, style_Schulen) 
    legend1.updateItem(lyrNachbarsch, style_Schulen) 
    legend2.updateItem(lyrEinzug, style_StatGeb) 
    legend1.elementPositionY = 25 
    legend2.elementPositionY = 11.0 
    legend2.elementPositionX = 1.5 

    #number of pupils 
    lyrSchuldaten = arcpy.mapping.Layer("filepath/Schulliste_PrSt.lyr") 
    arcpy.mapping.AddLayer(df_Sus, lyrSchuldaten) 
    lyrSchuldaten = arcpy.mapping.ListLayers(mapdoc, "Schulliste*")[0] 
    querySchule = delimfield2 + "= {0}".format(row[0]) 
    lyrSchuldaten.definitionQuery = querySchule 
    df_Sus.extent = lyrSchuldaten.getSelectedExtent(False) 
    arcpy.RefreshActiveView() 

    #Infotext 
    Infotext = arcpy.mapping.ListLayoutElements(mapdoc, "TEXT_ELEMENT", "Infotext")[0] 
    Infotext.text = "nicht darstellbar: SuS aus dem Umland \n \nAggregation: Statistische Gebiete \nKlassenberechnung: manuell gesetzte Intervalle \nDatenbezug: Wohnort der SuS \nDatenauszug: 10.01.14 \nKartengrundlage: DISK60" 
    Infotext.elementPositionY = 1.73 

    #Export map 
    if SF == "STS": 
     arcpy.mapping.ExportToPDF(mapdoc, "filepath/Einzugsgebiet_{0}.pdf".format(row[0])) 
     arcpy.mapping.ExportToJPEG(mapdoc, "filepath/Einzugsgebiet_{0}.jpg".format(row[0])) 
    elif SF == "G": 
     arcpy.mapping.ExportToPDF(mapdoc, "filepath/Einzugsgebiet_{0}.pdf".format(row[0])) 
     arcpy.mapping.ExportToJPEG(mapdoc, "filepath/Einzugsgebiet_{0}.jpg".format(row[0])) 


    #delete shapefiles 
    arcpy.Delete_management("GPL0.shp") 
    arcpy.Delete_management("GPL0_1.shp") 
    arcpy.Delete_management("GPL0_2.shp") 

EDIT:

Я пытался сохранять файлы в формате JPEG с высоким решением сегодня, что привело к сообщению об ошибке намного раньше, чем до того, который мог бы подчеркнуть, что у него есть что-то делать с доступной памятью?

+0

Я не думаю, что это имеет какое-либо отношение к Python. Попробуйте выяснить, какой файл возвращает ошибку, возможно, файл поврежден или у вас закончилась нехватка памяти. Python останавливается, потому что он получает ошибку. –

+0

Спасибо за ваш ответ, вот что я ожидал ... Я знаю, какой файл возвращает ошибку, но это не имеет никакого отношения к самому файлу. Запуск процесса только для этого файла работает совершенно нормально. Возможно, я ничего не могу изменить о памяти, верно? – Elena

+0

Единственный прогон в порядке, это может быть много. Трудно сказать отсюда. Вы уверены, что можете обрабатывать один файл? Когда вы протестировали его, вы выполнили ту же самую команду, что и скрипт? –

ответ

0

Попробуйте использовать переменные, которые ваша петля получает с 28-й карты. Похоже, что вы используете файл csv для всего этого, возможно, скопируйте столбец рабочей карты в строку, которая не работает, просто чтобы подтвердить, является ли это проблемой памяти. После того, как вы подтвердите, что тройная проверка всех значений из вашей 28-й школы. Похоже, что один из них может быть недействительным при попытке конвертировать в pdf.

+0

Это прекрасно работает, когда я только вычислил все для этой школы, как я уже говорил. Я попробовал еще раз, он не имеет ничего общего с переменными – Elena