Python exam help

From ICO wiki
Jump to navigationJump to search

To get GPS coordinates and image orientation:

from exifread import process_file
 
def degrees(j):
    return j.values[0].num + (j.values[1].num + j.values[2].den * 1.0 / j.values[2].num) / 60.0
 
tags = process_file(open("/home/sheela/Documents/Python/pics/IMG_20131019_201706.jpg"))
print tags
lat, lng = tags.get("GPS GPSLatitude"), tags.get("GPS GPSLongitude")
if lat and lng:
    print "%.4f,%.4f" % (degrees(lat), degrees(lng)),
 
# Parse datetime of the photo
timestamp = tags.get("EXIF DateTimeOriginal")
if timestamp:
    print timestamp.values,
 
# Parse image orientation
orientation = tags.get("Image Orientation")
 
if orientation:
    j, = orientation.values
    if j == 6:
        print "rotated 270 degrees",
    elif j == 8:
        print "rotated 90 degrees",
    elif j == 3:
        print "rotated 180 degrees",
 
print

This code is to remove the exif data - metadata

import Image
from exifread import process_file

image_file = open('/home/sheela/Documents/Python/pics/IMG_20150619_120040.jpg')
image = Image.open(image_file)

# next 3 lines strip exif
data = list(image.getdata())
image_without_exif = Image.new(image.mode, image.size)
image_without_exif.putdata(data)

image_without_exif.save('without_exif_data.jpeg')

This code is to rotate the picture (which do not have metadata) to original view

import Image
orig = Image.open("original.jpg")
rotated = orig.transpose(Image.ROTATE_90) # This happens only in the RAM!
rotated.save("rotated.jpg")
import Image
from exifread import process_file

#input_path, output_path = sys.argv[1:]

image_file = open('/home/sheela/Documents/Python/pics/IMG_20131019_201706.jpg')
image = Image.open(image_file)

# next 3 lines strip exif
data = list(image.getdata())
image_without_exif = Image.new(image.mode, image.size)
image_without_exif.putdata(data)

image_without_exif.save('without_exif_data.jpeg')


im = Image.open("/home/sheela/Documents/Python/pics/IMG_20131019_201706.jpg")
rotated = im.transpose(Image.ROTATE_90)
im.save("rotated.jpg")

#orig = Image.open(output_path)
#rotated = orig.transpose(Image.ROTATE_90) # This happens only in the RAM!
#rotated.save(output_path)

dexif.py Lauri's code

import codecs, os, sys
from exifread import process_file
from PIL import Image
from jinja2 import Template

input_path, output_path = sys.argv[1:] 
if not os.path.exists(output_path):
    os.makedirs(os.path.join(output_path, "thumbnails"))
template = Template(codecs.open("gallery.html", "r", encoding="utf-8").read())
with codecs.open("/tmp/bulid/index.html", "w", encoding="utf-8") as fh:
     fh.write(template.render(files = os.listdir(input_path)))

for filename in os.listdir(input_path):
        if not filename.endswith(".jpg"): continue 
        print filename
        tags = EXIF.process_file(open(os.path.join(input_path, filename)))
        im = Image.open(os.path.join(input_path, filname))
        rotated = im # Not roated at all
        orientation = tags.get("Image orientation") # paese image orientation
        if orientation:
            j, = orientation.values
            if j == 6:
                rotated = im.transpose(Image.ROTATE_270)
            elif j == 8:
                rotated = im.transpose(Image.ROTATE_90)
            elif j == 3:
                rotated = im.transpose(Image.ROTATE_180)
        rotated.save(os.path.join(output_path, filename))
        rotated.thumbnail((192,192), Image.ANTIALIAS)
        rotated.save(os.path.join(output_path, "thumbnails", filename))

Artur code A.py

import Image
import sys
from exifread import process_file

input_path, output_path = sys.argv[1:]

image_file = open(input_path)
image = Image.open(image_file)

data = list(image.getdata())
no_exif = Image.new(image.mode, image.size)
no_exif.putdata(data)

no_exif.save(output_path)

orig = Image.open(output_path)
rotated = orig.transpose(Image.ROTATE_90) # This happens only in the RAM!
rotated.save(output_path)

To get image thumbnail

<<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title>Images</title>
    <style>
        body {
            background-color: #444;
        }

        .thumbnail {
            position: relative;
            display: inline;
            margin: 1em;
            padding: 0;
            width: 192;
            height: 192;
            box-shadow: 0px 0px 10px rgba(0,0,0,1);
        }
    </style>
  </head>
  <body>
    {% for filename in files % 
        <a href= "{{filename}}">
            <img class="thumbnail" src="thumbnails/{{filename}}"/>  
       </a>
    {% endfor %}
  </body>
</html>

Final result all in one file

# I need to mention my path like this - python dexif2.py /home/sheela/Documents/Python/pics /home/sheela/Documents/Python 

import codecs, os,sys
from exifread import process_file
from PIL import Image
from jinja2 import Template
 
# Grab arguments specified on the command line after: python paranoia.py <input_dir> <output_dir>
input_directory, output_directory = sys.argv[1:]
 
# Create output directories if necessary
if not os.path.exists(output_directory):
    os.makedirs(os.path.join(output_directory, "thumbnails"))
 
HEADER = """<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <style>
        body { background-color: #444; }
        img.thumb { position: relative; display: inline; margin: 1em;
            padding: 0; width: 192; height: 192;
            box-shadow: 0px 0px 10px rgba(0,0,0,1); }
    </style>
  </head>
  <body>
"""

# Open index.html in output diretory and write it line by line
with open(os.path.join(output_directory, "index.html"), "w") as fh:
    fh.write(HEADER)
 
    for filename in os.listdir(input_directory):        
        # Read EXIF tags
        tags = process_file(open(os.path.join(input_directory, filename)))
 
        # Read image data
        original = Image.open(os.path.join(input_directory, filename))
 
        # Rotate as necessary
        rotated = original # Not rotated at all
        orientation = tags.get("Image Orientation") # Parse image orientation        
        if orientation:
            j, = orientation.values
            if j == 6:
                rotated = original.transpose(Image.ROTATE_270)                
            elif j == 8:
                rotated = original.transpose(Image.ROTATE_90)
            elif j == 3:
                rotated = original.transpose(Image.ROTATE_180)
        rotated.save(os.path.join(output_directory, filename))
 
        # Save thumbnail        
        rotated.thumbnail((192,192), Image.ANTIALIAS)
        rotated.save(os.path.join(output_directory, "thumbnails", filename))
        fh.write("""    <a href="%s">""" % filename)
        fh.write("""<img class="thumb" src="thumbnails/%s"/>""" % filename)
        fh.write("""</a>\n""")
    fh.write("  </body>\n")
    fh.write("</html>\n")

Exam answer

import shutil, sys, magic, os from mutagen.easyid3 import EasyID3 from mutagen.id3 import ID3NoHeaderError

db = magic.open(magic.MAGIC_MIME_TYPE) db.load()

try:

   input_directory, output_directory = sys.argv[1:3]

except ValueError:

   print "Not enough arguments!"
   sys.exit(255)

for filename in os.listdir(input_directory):

   path = os.path.join(input_directory, filename)
   if db.file(path) not in ("application/octet-stream", "audio/mpeg"):
       continue

   try:
       tags = EasyID3(path)
   except ID3NoHeaderError:
       continue

   artist, = tags.get("artist")   # artist = tags.get("artist")[0]
   album, = tags.get("album")
   title, = tags.get("title")
   year, = tags.get("date")
   tracknumber, = tags.get("tracknumber")

   if "/" in tracknumber:
       tracknumber, _ = tracknumber.split("/")

   directory_name = "%s - %s (%s)" % (artist, album, year)
   target_name = "%02d. %s - %s.mp3" % (int(tracknumber), artist, title)

   if not os.path.exists(os.path.join(output_directory, directory_name)):
       os.makedirs(os.path.join(output_directory, directory_name))
   shutil.copy(path, os.path.join(output_directory, directory_name, target_name))
   print "Move from:", filename, "to:", os.path.join(directory_name, target_name)

</source>


EXAMPLE

SLICING

#Slice syntax forms:

	     Get elements from...
values[1:3]  Index 1 through index 3.
values[2:-1] Index 2 through index one from last.
values[:2]   Start through index 2.
values[2:]   Index 2 through end.
values[::2]  Start through end, skipping ahead 2 places each time.
...............................................................
#Python program that slices list

values = [100, 200, 300, 400, 500]
# Get elements from second index to third index.
slice = values[1:3]
print(slice)

Output

[200, 300]
....................................

#Python that creates slice object

# Create a slice object.
example = slice(1, 10, 0)
print(example.start, example.stop, example.step)

Output

1 10 0

.......................................................
#Python program that resizes list

letters = ["x", "y", "z", "a", "b"]
print(letters)

# Resize list to two elements at the start.
letters = letters[:2]
print(letters)

Output

['x', 'y', 'z', 'a', 'b']
['x', 'y']
........................................
#Python program that reduces size

values = [10, 20, 30, 40, 50]
print(values)

# Reduce size of list by 2 elements.
values = values[:-2]
print(values)

Output

[10, 20, 30, 40, 50]
[10, 20, 30]
............................................
#Python program that slices, starts and ends

values = [100, 200, 300, 400, 500]
# Slice from start to second index.
slice = values[:2]
print(slice)

# Slice from second index to end.
slice = values[2:]
print(slice)

Output

[100, 200]
[300, 400, 500]
.........................................
#Python program that slices string

word = "something"
# Get first four characters.
part = word[:4]
print(part)

Output

some
...............................................

#Python program that locates relative slices

def between(value, a, b):
    # Find and validate before-part.
    pos_a = value.find(a)
    if pos_a == -1: return ""
    # Find and validate after part.
    pos_b = value.rfind(b)
    if pos_b == -1: return ""
    # Return middle part.
    adjusted_pos_a = pos_a + len(a)
    if adjusted_pos_a >= pos_b: return ""
    return value[adjusted_pos_a:pos_b]

def before(value, a):
    # Find first part and return slice before it.
    pos_a = value.find(a)
    if pos_a == -1: return ""
    return value[0:pos_a]

def after(value, a):
    # Find and validate first part.
    pos_a = value.rfind(a)
    if pos_a == -1: return ""
    # Returns chars after the found string.
    adjusted_pos_a = pos_a + len(a)
    if adjusted_pos_a >= len(value): return ""
    return value[adjusted_pos_a:]

# Test the methods with this literal.
test = "DEFINE:A=TWO"
print(between(test, "DEFINE:", "="))
print(between(test, ":", "="))

print(before(test, ":"))
print(before(test, "="))

print(after(test, ":"))
print(after(test, "DEFINE:"))
print(after(test, "="))

Output

A
A
DEFINE
DEFINE:A
A=TWO
A=TWO
TWO

............................
#copy list

ython program that copies list

# A list:
list1 = [10, 20, 30]

# Copy list1 with slice syntax.
list2 = list1[:]

# Modify list2.
list2[0] = 0

print(list1)
print(list2)

Output

[10, 20, 30]
[0, 20, 30]

..........................
#Extend 

Python program that uses extend, copies list

list1 = [10, 20, 30]

# Create empty list, then extend it.
list2 = []
list2.extend(list1)

# The lists are separate.
list2[0] = 0

print(list1)
print(list2)

Output

[10, 20, 30]
[0, 20, 30]


....................
#slicing
ex:1
s = "abcdefghijklmnopqrs"

# Loop over some indexes.
for n in range(2, 4):
    #Print slices.
    print(n, s[n])       #(2, 'c') (3, 'd')
    print(n, s[n:n + 2])  #(2, 'cd')(3, 'de')
    print(n, s[n:n + 3]) #(2, 'cde')(3, 'def')
    print(n, s[n:n + 4:2]) #(2, 'ce')(3, 'df')
    print(n, s[n:n + 6:2]) #(2, 'ceg')(3, 'dfh')

.............
#Normally, you would just do:

s = s[:-3] + s[-2:]

The s[:-3] gives you a string up to, but not including, the comma you want removed ("this is a string") and the s[-2:] gives you another string starting one character beyond that comma (" a").

Then, joining the two strings together gives you what you were after ("this is a string a").


.....................
#ANother example.
>>> t = (2, 5, 7, 9, 10, 11, 12)
>>> t[2:4]
(7, 9)

.................
#splitting string

ex:1

x = 'blue,red,green'
x.split(",")

['blue', 'red', 'green']
>>> 

>>> a,b,c = x.split(",")

>>> a
'blue'

>>> b
'red'

>>> c
'green'

ex:2

>>> word = "This is some random text"

>>> words2 = word.split(" ")

>>> words
['This', 'is', 'some', 'random', 'text']

................
#SPILITTING ANOTHER METHOD

Following is the syntax for split() method 
str.split(str="", num=string.count(str)).

Ex:1
#!/usr/bin/python

str = "Line1-abcdef \nLine2-abc \nLine4-abcd";
print str.split( )
print str.split(' ', 1 )

output:
'Line1-abcdef', 'Line2-abc', 'Line4-abcd']
['Line1-abcdef', '\nLine2-abc \nLine4-abcd']
...................................................
#JOINING STRING 

Following is the syntax for join() method:

str.join(sequence)

Example1:
he following example shows the usage of join() method.

#!/usr/bin/python

s = "-";
seq = ("a", "b", "c"); # This is sequence of strings.
print s.join( seq )

When we run above program, it produces following result 

a-b-c

.............................
#String Formatting

String formatting with %

ex:1
x = 'apple'
y = 'lemon'
z = "The items in the basket are %s and %s" % (x,y)

................................

#String formatting using { }
ex:1
fname = "Joe"
lname = "Who"
age = "24"

#Example of how to use the format() method:
print "{} {} is {} years ".format(fname, lname, age)

Another really cool thing is that we don't have to provide the inputs in the same order, if we number the place-holders.
print "{0} {1} is {2} years".format(fname, lname, age)

...............................
#Python program that gets one-character substring

value = "web"

# Loop over every index in string.
for index in range(0, len(value)):

    # Get one-character substring.
    char = value[index]

    # Display substring.
    print(char)

    # Test substring.
    if char == "w":
        print(True)

Output:

w
True
e
b
...................
#Python program that takes substrings

string = "abcdefgh"

# Two-character substring.
two = string[0:2]

# Three-character substring.
three = string[0:3]

# Four-character substring.
four = string[0:4]

# Five-character substring.
five = string[0:5]

print(two)
print(three)
print(four)
print(five)

Output:

ab
abc
abcd
abcde
......................................................
#Python program that uses offset

string = "abcdefgh"

# Three characters starting at index 2.
offset = 2
length = 3
sliced = string[offset:offset+length]
print(sliced)

Output

cde
........................
#Python program that omits start index

value = "google"

# Omitting the start means start at 0.
test1 = value[:2]
test2 = value[0:2]

print(test1)
print(test2)

Output

go
go
..............................
#Python program that gets last two characters

value = "apple"

# Get last two characters.
end = value[-2:]
print(end)

Output

le
...........................
#Python that causes error

value = "dotperls"
value[3] = " net " # Does not work.
print(value)

Output

Traceback (most recent call last):
  File "...\file.py", line 6, in <module>
    value[3:] = " net "
TypeError: 'str' object does not support item assignment
......................................................
#Python that uses slice, gets first words

def first_words(input, words):
    for i in range(0, len(input)):
        # Count spaces in the string.
        if input[i] == ' ':
            words -= 1
        if words == 0:
            # Return the slice up to this point.
            return input[0:i]
    return ""

# Test our method.
test = "Stately, plump Buck Mulligan came from the stairhead."
result = first_words(test, 4)
print(result)

Output

Stately, plump Buck Mulligan
..........................................................
#Python program that truncates string

value = "one two three"

# Truncate the string to 3 characters.
first = value[0:3]
print(first + ".")

# Truncate the string to 7 characters.
second = value[0:7]
print(second + ".")

Output

one.
one two.
..........................................
#Python program that uses short truncation syntax

letters = "abcdef"

# Omit the first 0 in the slice syntax.
# ... This truncates the string.
first_part = letters[:3]
print(first_part)

Output

abc
...............................

#LIST MANIPULATING 

 first we need an example list:
x = [1,6,3,2,6,1,2,6,7]
# lets add something.
# we can do .append, which will add something to the end of the list, like:
x.append(55)
print(x)

Above, we took a list, and added to the end of the list with .append. Remember append with files? Same thing, .append() will add to the end of a list.
.......

x.insert(2,33)
print(x)
Here we say that we want to insert, at the index of 2, the number 33. The reason that went in the 3rd place, again, is because we start at the zero element, then go 1, 2...etc with lists.
.........

x.remove(6)
print(x)
Now we can remove things. .remove() will remove the first instance of the value in the list. If it doesn't exist, there will be an error:

...........
Next, remember how we can reference an item by index in a list? like:

print(x[5])
................

Well, we can also search for this index, like so:

print(x.index(1))

.............
Now here, we can see that it actually returned a 0, meaning the first element was a 1... when we knew there was another with an index of 5. So, instead we might want to know before-hand how many examples there are.

print(x.count(1))

We see there are actually 2 of them

We can also sort the list:

x.sort()
print(x)

What if these were strings? like:

y = ['Jan','Dan','Bob','Alice','Jon','Jack']
y.sort()
print(y)
y.reverse()
print(y)
.......................................

#DICT
To access dictionary elements, you can use the familiar square brackets along with the key to obtain its value. Following is a simple example 

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

print "dict['Name']: ", dict['Name']
print "dict['Age']: ", dict['Age']

When the above code is executed, it produces the following result 

dict['Name']:  Zara
dict['Age']:  7
...............................

#Updating Dictionary

You can update a dictionary by adding a new entry or a key-value pair, modifying an existing entry, or deleting an existing entry as shown below in the simple example 

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

dict['Age'] = 8; # update existing entry
dict['School'] = "DPS School"; # Add new entry


print "dict['Age']: ", dict['Age']
print "dict['School']: ", dict['School']

When the above code is executed, it produces the following result 

dict['Age']:  8
dict['School']:  DPS School

.....................................
#Example Dict value

The following example shows the usage of values() method.

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7}

print "Value : %s" %  dict.values()

When we run above program, it produces following result 

Value : [7, 'Zara']

..........................
#Dict default key 

dict.setdefault(key, default=None)

he following example shows the usage of setdefault() method.

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7}

print "Value : %s" %  dict.setdefault('Age', None)
print "Value : %s" %  dict.setdefault('Sex', None)

When we run above program, it produces following result 

Value : 7
Value : None

Dict items

The following example shows the usage of items() method.

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7}

print "Value : %s" %  dict.items()

When we run above program, it produces following result 

Value : [('Age', 7), ('Name', 'Zara')]