22

Is there a way with ArcPy to identify the version of a Map Document (MXD). I am working on a solution to inventory our MXD's and would like to know if a document is 8.1, 9.2, 10.0, etc.

I am currently using ArcMap 10.0, but if there is an update in 10.1 that does not exist in 10.0, I am interested in that, too.

I see there is a previous question of How can you find ArcGIS version programatically?, but it references all ArcObjects solutions (which I suppose I could call from python, but I would prefer not to).

PolyGeo
65.5k29 gold badges115 silver badges349 bronze badges
asked May 28, 2013 at 22:08
0

2 Answers 2

25

I developed this kludge to parse version numbers from MXD documents. It basically reads the first 4000 or so characters of an MXD document and searches for a version number. I tested with MXD versions 9.2, 9.3, 10.0, and 10.1.

import re
def getMXDVersion(mxdFile):
 matchPattern = re.compile("9.2|9.3|10.0|10.1|10.2")
 with open(mxdFile, 'rb') as mxd:
 fileContents = mxd.read().decode('latin1')[1000:4500]
 removedChars = [x for x in fileContents if x not in [u'\xff',u'\x00',u'\x01',u'\t']]
 joinedChars = ''.join(removedChars)
 regexMatch = re.findall(matchPattern, joinedChars)
 if len(regexMatch) > 0:
 version = regexMatch[0]
 return version
 else:
 return 'version could not be determined for ' + mxdFile

Here is an example of scanning a folder for mxd files and printing the version and names

import os
import glob
folder = r'C:\Users\Administrator\Desktop\mxd_examples'
mxdFiles = glob.glob(os.path.join(folder, '*.mxd'))
for mxdFile in mxdFiles:
 fileName = os.path.basename(mxdFile)
 version = getMXDVersion(mxdFile)
 print version, fileName

Which returns this:

>>> 
10.0 Arch_Cape_DRG.mxd
9.2 class_exercise.mxd
9.3 colored_relief2.mxd
10.1 CountyIcons.mxd
10.0 DEM_Template.mxd
9.2 ex_2.mxd
10.0 nairobimap.mxd
10.0 slope_script_example.mxd
10.1 TrailMapTemplateBetter.mxd
10.0 Wickiup_Mountain_DEM.mxd
>>>
PolyGeo
65.5k29 gold badges115 silver badges349 bronze badges
answered Oct 16, 2013 at 4:36
0
16

The function below is based on Ryan's idea, but is a little more direct. ArcGIS map documents are actually OLE documents, which can be parsed with the oletools module (available on pypi: https://pypi.python.org/pypi/oletools). The function opens the file and reads the version string. Tested with 9.0, 9.3, 10.1 and 10.3, but should work with anything (not sure about 3.x...).

from oletools.thirdparty import olefile
def mxd_version(filename):
 ofile = olefile.OleFileIO(filename)
 stream = ofile.openstream('Version')
 data = stream.read().decode('utf-16')
 version = data.split('\x00')[1]
 return version
if __name__ == '__main__':
 import sys
 print(mxd_version(sys.argv[-1]))
answered Apr 15, 2015 at 14:56
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.