Take the 2-minute tour ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

I have a program (720 lines of code) that runs multiple tasks on Arcmap .mxd files. Such as update layers, update text, add layers, etc.

Within my program I have multiple "mxd.save()" instances. All of which occur within for loops.

For example:

for item in mxds:
    mxd = arcpy.mapping.MapDocument(item)
    df=arcpy.mapping.ListDataFrames(mxd,"Project Area")[0]
    print "HOWDY!"              

Question is can I just have at the very end of my program have one for loop that saves all the mxds I was working on, while still retaining all the changes?


Problem I think am having is this. I have one of my for loops that adds a layer to the map. If I do not mxd.save() after that layer is added. My program later when it attempts to find the layer that was added cannot find it. I guess it's not held in memory.


THANKS! I was doing something similar, but wrong none the less. Each time I had a for loop I would create a new .MapDocument object which I realized (thanks to you) was unnecessary. I now define the mapdocument object once at the start of my program and work from there. Do this has also greatly increased the speed of my program.

share|improve this question
add comment

1 Answer

up vote 5 down vote accepted

You sure can. As long as .save() is called on every map document object you have open before you close it (either by leaving a function if it's opened there or the script ends) your changes will persist. If you're working on one mxd at a time, though, I'd recommend saving each one as soon as you're done with it, just in case an error further down the line in the script prevents it from making it all the way to the part where it does all the saves at once.

Update after OP's update: mxds should be a list of MapDocument objects if you want it to work that way and NOT a list of strings that are paths to MXDs. Each time you create a MapDocument object it is its own entity independent of any other. What you REALLY want to do is something more like this:

mxdFiles = [r'c:\a.mxd', r'c:\b.mxd', r'c:\c.mxd']
mxds = [arcpy.mapping.MapDocument(mxdFile) for mxdFile in mxdFiles]
for mxd in mxds:
    df = arcpy.mapping.ListDataFrames(mxd,"Project Area")[0]
    print "HOWDY!"
# .. more code ..
for mxd in mxds:              
share|improve this answer
See update..... –  TForward Sep 19 '12 at 15:03
Thanks! See Update2 –  TForward Sep 19 '12 at 15:55
add comment

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.