How to get Exif data from a jpeg file

Discussion in 'Python' started by Arnaud Delobelle, May 16, 2009.

  1. Hi all,

    I need to get the creation date from a jpeg file in Python. Googling
    brought up a several references to apparently defunct modules. The best
    way I have been able to find so far is something like this:

    from PIL import Image
    img = Image.open('img.jpg')
    exif_data = img._getexif()
    creation_date = exif_data[36867]

    Where 36867 is the exif tag for the creation date data (which I found by
    ooking at PIL.ExifTags.TAGS). But this doesn't even seem to be
    documented in the PIL docs. Is there a more natural way to do this?

    Thanks.
     
    Arnaud Delobelle, May 16, 2009
    #1
    1. Advertisements

  2. I need to get the creation date from a jpeg file in Python. Googling

    Have you tried http://sourceforge.net/projects/exif-py/ ?

    HTH,
    Daniel
     
    Daniel Fetchinson, May 16, 2009
    #2
    1. Advertisements

  3. I will have a look - thank you.
     
    Arnaud Delobelle, May 17, 2009
    #3
  4. Arnaud Delobelle

    BJ Swope Guest


    I use the EXIF module to do bulk renames of all the pictures in a directory..

    Here's my hackeration...



    import sys
    import os
    import re
    import time
    import win32file
    import datetime
    import EXIF

    DATE_FORMAT   = '%Y%m%d_%H%M%S'
    allowed_files = ['.asf', '.jpg', '.mod', '.mov', '.mpeg', '.mpg',
    '.jpeg', '.png', '.tiff', '.tif']
    named_files = []

    r = re.compile('.mod',)

    def is_a_file(path, file, xtn):
        """
        We only want to rename the files right?
        Return True or False depending on whether object is a file or a directory
        """

        if os.path.isdir(os.path.join(path,file)):
            print "This is a directory not a file.  Will not rename!"
            return False
        if allowed_files.count(xtn):
            return True
        else:
            print file, "is not a in the list of allowed extensions. Will
    not rename!"
            return False


    def renameFile(path, file):
        """ Rename <old_filename> with the using the date/time created or
    modified for the new file name"""

        old_filename = os.path.join(path,file)

        (name,xtn) = os.path.splitext(file)
        xtn = xtn.lower()

        if re.search(r, xtn):
            xtn_old = xtn
            xtn = '.mpg'
            print xtn_old, 'changed to', xtn

        if is_a_file(path, file, xtn):
            created_time = os.path.getctime(old_filename)
            modify_time = os.path.getmtime(old_filename)

            f = open(old_filename, 'rb')
            try:
                tags=EXIF.process_file(f)
            except UnboundLocalError:
                print "No EXIF data available for ", file
                tags = {}
                exif_time = 0
            try:
                tags['EXIF DateTimeOriginal']
                exif_time = str(tags['EXIF DateTimeOriginal'])
                exif_time = int(time.mktime(time.strptime(exif_time,
    "%Y:%m:%d %H:%M:%S")))
            except (KeyError,ValueError):
                print 'No EXIF DateTimeOriginal for ', file
                exif_time = 0
            f.close()

            if created_time < modify_time:
                local_time = time.localtime(created_time)
            else:
                local_time = time.localtime(modify_time)

            if exif_time:
                if exif_time < local_time:
                    local_time = time.localtime(exif_time)

            date_time_name = time.strftime(DATE_FORMAT, local_time)

            copy_number = named_files.count(date_time_name)
            named_files.append(date_time_name)

            new_name = date_time_name + "_" + str(copy_number) + xtn

            new_filename = os.path.join(path, new_name)

            print 'Renaming:', old_filename, 'to', new_filename
            #print 'Created Time  = ', created_time
            #print 'Modified Time = ', modify_time
            #print 'EXIF Time     = ', exif_time
            #print 'Time Used     = ', local_time
            os.rename(old_filename, new_filename)


    if __name__ == '__main__':
        if os.path.isdir(sys.argv[1]):
            """Recursively walk the directory listed as Arg 1 and work each file."""
            print
            for path,dirs,files in os.walk(sys.argv[1]):
                for file in files:
                    renameFile(path, file)
        else:
            print "\nNo path to rename specified.\n"
            print "Usage:\n\tpython", sys.argv[0], "<path to directory of
    source files>"
            sys.exit(1)




    --
    We are all slave to our own paradigm. -- Joshua Williams

    If the letters PhD appear after a person's name, that person will
    remain outdoors even after it's started raining. -- Jeff Kay

    Fascism is a term used to describe authoritarian nationalist political
    ideologies or mass movements that are concerned with notions of
    cultural decline or decadence and seek to achieve a millenarian
    national rebirth by exalting the nation or race, and promoting cults
    of unity, strength and purity. - Wikipedia

    The story of postwar American conservatism is best understood as a
    continual replay of a single long-standing debate. On one side are
    those who have upheld the Burkean ideal of replenishing civil society
    by adjusting to changing conditions. On the other are those committed
    to a revanchist counterrevolution, the restoration of America's
    pre-welfare state ancien regime. And, time and again, the
    counterrevolutionaries have won. The result is that modern American
    conservatism has dedicated itself not to fortifying and replenishing
    civil society but rather to weakening it through a politics of civil
    warfare. -- Sam Tanenhaus
     
    BJ Swope, May 18, 2009
    #4
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.