iTunes playlist copier
overwrite would be better as True or False.

Since each file is treated independently, you should define a function to make the independence obvious.

To split and join path components, use os.path.split() and os.path.join() instead of doing your own string analysis.  The interface is slightly nicer, and it also ensures that there won't be missing or extra / separators.

If you reorder the conditionals, you could reduce the number of os.path.exists() tests in the don't-overwrite case, where the destination file already exists.

Print 'Copying filename' before copying the file, so that if the copying fails, you'll see which file it failed on.  Print "Finished." instead of "Finished....", because ellipses imply that the job is incomplete.

import os
from shutil import copyfile
import urllib
from xml.etree.ElementTree import ElementTree

def copy_song(url, dest, overwrite=False):
    if not url.startswith('file://'):
        return

    orig_path = urllib.unquote(url[len('file://'):])
    orig_dirname, basename = os.path.split(orig_path)
    dest_dirname = os.path.join(dest, orig_dirname)
    dest_path = os.path.join(dest_dirname, basename)

    if not overwrite and os.path.exists(dest_path):
        print 'Skipping ' + orig_path
    else:
        if not os.path.exists(dest_dirname):
            os.mkdir(dest_dirname)
        print 'Copying ' + orig_path
        copyfile(orig_path, dest_path)


playlist = "/path/to/playlist.xml"
dest = '/path/to/destination';

playlist_xml = ElementTree.parse(playlist)
for song in playlist_xml.findall('/dict/dict/dict/string'):
    copy_song(song.text, dest)
print 'Finished.'