Python Notes


Contents:
Links to Posts  IO   Data Structures  Strings  Dirs+Files Admin, os, sys Control Flow Introspection Big Templates Modules Parsing


Links to Posts Back to Contents


IO Back to Contents

Logging

import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG) # DEBUG => print ALL msgs
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

Loop over Dir Content

import os, fnmatch, shutil
for filename in os.listdir('.'):
    if fnmatch.fnmatch(filename, '*.txt'):
        if not os.path.isdir(filename): shutil.copy(filename, 'example_dir')

stdout write

import sys
sys.stdout.write('hello'+'n')

tee stdout to file

# from <a href="http://stackoverflow.com/questions/616645/how-do-i-duplicate-sys-stdout-to-a-log-file-in-python">stackOflow</a>
class Logger(object):
def __init__(self, path2logFile):
self.terminal = sys.stdout
self.log = open(path2logFile, "a")
def write(self, message):
self.terminal.write(message)
self.log.write(message)
self.flush()
def close(self):
self.log.close()
def flush(self):
self.terminal.flush()
self.log.flush()
# usage
# run 1
logger = Logger('run1.log')
sys.stdout = logger
print 'stuff to run1.log & sys.stdout'
print 'more stuff to run1.log & sys.stdout'
sys.stdout = stdoutorig # restore stdout BEFORE closing the log file
logger.close(); logger = None

# run 2
logger = Logger('run2.log')
sys.stdout = logger
print 'stuff to run2.log & sys.stdout'
print 'more stuff to run2.log & sys.stdout'
sys.stdout = stdoutorig # restore stdout BEFORE closing the log file
logger.close(); logger = None

redir stdout to file

import sys
stdoutorig = sys.stdout
sys.stdout = f = open('run.log', 'w')
print 'hello'
sys.stdout.write('hello'+'n')
f.close()
sys.stdout = stdoutorig

redir stdout to StringIO()

# capturePrint.py

def capturePrint(executableStrThatPrints):

import sys, StringIO

# redir sys.stdout
stdoutorig = sys.stdout
sys.stdout = reportSIO = StringIO.StringIO()

eval(executableStrThatPrints)
reportStr = reportSIO.getvalue()

# restore sys.stdout so we can print
sys.stdout = stdoutorig

return reportStr

def testCapturePrint():
from music21 import *
global sBach
sBach = corpus.parse('bach/bwv7.7')
x = capturePrint("""sBach.show('text')""")
print x

if __name__ == '__main__':
testCapturePrint()

readFile2List 1 line

f = open('c:/test.txt', 'r'); l = f.read().splitlines(); f.close()

readFile2String

f = open('c:/', 'r') #on windows add 'b'==binary
s = f.read()
f.close()

readline

>>>print f.readline()
this is the first line
>>>print f.readline()
this is the second line

readLines

f = open('c:/', 'r') #on windows add 'b'==binary
for line in f:
    # process(line)
f.close()

writeString 1 liner

f = open('c:/', 'w'); f.write('This is a test\n'); f.close()

writeString

f = open('c:/', 'w') #on windows add 'b'==binary
f.write('This is a test\n') # newline is NOT automatically added!
f.close()

Print to file

f = open('out.txt','w')
print >>f, xml_body

rcw – Read Compute Write – filter – file 2 file

linecountmax = 1000
linecount = 0
blanks = 0
inf = open(INFILEPATH, 'r')
outf = open(OUTFILEPATH,'w')

for line in inf:
    linecount += 1
    if linecount > linecountmax: break
    oline = line
    if len(line) == 0:
        blanks += blanks
        # In here put in filtering criteria and action
        continue 
    outf.write(line)

readFile2String

f = open('c:/', 'r') #on windows add 'b'==binary
s = f.read()
f.close()

readFile2String 1 liner

f = open('c:/test.txt', 'r'); s = f.read(); f.close()

readFile2String

f = open('c:/', 'r') #on windows add 'b'==binary
s = f.read()
f.close()

readline

>>>print f.readline()
this is the first line
>>>print f.readline()
this is the second line

readLines

f = open('c:/', 'r') #on windows add 'b'==binary
for line in f:
    # process(line)
f.close()

Joe Question to self:

DID i already convert some of the above and below?

writeString 1 liner

f = open('c:/', 'w'); f.write('This is a test\n'); f.close()

writeString

f = open('c:/', 'w') #on windows add 'b'==binary
f.write('This is a test\n')  # newline is NOT automatically added!
f.close()

Print to file

f = open('out.txt','w')
print >>f, xml_body

Print Left Justified

print "%-15s:  [ "%("'"+chordName+"'"), # Left Justified
for p in pitches:
    print "%4s,"%(p),
print " ],"

Pretty Print

from pprint import pprint as pp
pp(staves, width=30, depth=2)        # output to stdout

test_outfile = open(test_out_file_path, 'w')
pp(staves, stream=test_outfile, width=30, depth=2)        # output to test_outfile

CSV Reformat

# Derived From: http://www.linuxjournal.com/content/handling-csv-files-python
import csv
ifile  = open('db_daily_reflection.csv', 'rb')
reader = csv.reader(ifile)

items = []
for row in reader:    
    items.append(row)

ifile.close()
raw_input('hit return to quit')

Data Structures Back to Contents

slice notation see

x[start:end] # items start through end-1
x[start:]    # items start through the rest of the list
x[:end]      # items from the beginning through end-1
x[:]         # a copy of the whole list

x[start:end:step] # start through not past end, by step

x[-1]    # last item in the list
x[-2:]   # last two items in the list
x[:-2]   # everything except the last two items

 +---+---+---+---+---+
 | H | e | l | p | A |
 +---+---+---+---+---+
 0   1   2   3   4   5
-5  -4  -3  -2  -1

# reverse of x
>>> x = [1,2,3,4,5,6]
>>> x[::-1]          # reverse of x
[6,5,4,3,2,1]

# slice assignment
>>> r=[1,2,3,4]
>>> r[1:1]
[]
>>> r[1:1]=[9,8]
>>> r
[1, 9, 8, 2, 3, 4]
>>> r[1:1]=['blah']
>>> r
[1, 'blah', 9, 8, 2, 3, 4]

# list concatenation
>>> a = [1,2,3,4,5]
>>> b = [6,7,8,9,0]
>>> a + b
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> a + b[:3]
[1, 2, 3, 4, 5, 6, 7, 8]

# c   is a shallow copy of   a
>>> a = [1, 2, 3, 4]
>>> b = a
>>> c = a[:]
>>> b[2] = 10
>>> c[3] = 20
>>> a
[1, 2, 10, 4]
>>> b
[1, 2, 10, 4]
>>> c
[1, 2, 3, 20]

dict from k v lists

dict(zip(keyList, valList))

dict from k v strings

dict(zip(keyStr.split(' '), valString.split(' ')))

dict from obj attribs

dict((name, getattr(ob, name)) for name in dir(ob) if not name.startswith('__'))

map cube(x)

seq = range(10)
def cube(x): return x*x*x
map(cube, seq)

map add(x,y)

seq = range(10)
def add(x, y): return x+y
map(add, seq, seq)

reduce

seq = range(10)
def add(x, y): return x+y
reduce(add, seq)

list2string

s = ''.join(L)

list creations

L = s.split('#')
iota=range(5)
zeros=[0]*5
foos=['foo']*8
L=[0,1,2] + [3,4]
four=L[-1]
three=L[-2]
zero_1=L[:2]
two_3_4=L[2:]
one_2_3=L[1:4]
del(L[1])
listoflists=[ [0]*4 ] *5
listoflists=[[0]*4 for i in range(5)]

Here’s how i initialize a list of lists. Rows vary slowest.

nrows = 3; ncols = 5

l_of_ls = [[0]*ncols for i in range(nrows )]

for rix, r in enumerate(l_of_ls):
    for cix, c in enumerate(r):
        print rix, cix, 'val = ',c

RESULT

0 0 val =  0
0 1 val =  0
0 2 val =  0
0 3 val =  0
0 4 val =  0
1 0 val =  0
1 1 val =  0
1 2 val =  0
1 3 val =  0
1 4 val =  0
2 0 val =  0
2 1 val =  0
2 2 val =  0
2 3 val =  0
2 4 val =  0

Also Worth Noting for Indexing Purposes

for rix in range(nrows):
    for cix in range(ncols):
        print l_of_ls[rix][cix],
    print
        
result = '''
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0  
'''   

list comprehension [simple]

vec = [2, 4, 6]
[3*x for x in vec]

list comprehension [if]

vec = [2, 4, 6]
[3*x for x in vec if x > 3]

list comprehension [->list]

vec = [2, 4, 6]
[[x,x**2] for x in vec]

list comprehension [->dict]

l1=1,2,3,4,5; l2=6,7,8,9,0
dict([(k, v) for k,v in zip(l1,l2)])
# {1: 6, 2: 7, 3: 8, 4: 9, 5: 0}

list comprehension [v1, v2]

vec1 = [2, 4, 6]
vec2 = [4, 3, -9]
[x*y for x in vec1 for y in vec2]
# rightmost for varies first
# [8, 6, -18, 16, 12, -36, 24, 18, -54]

list comprehension [->tuples l1, l2]

l1=1,2,3; l2=6,7,8
[{x:y} for x in l1 for y in l2]
# rightmost for varies first
# [{1: 6}, {1: 7}, {1: 8}, {2: 6}, {2: 7}, {2: 8}, {3: 6}, {3: 7}, {3: 8}]

list comprehension [nested]

mat = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
      ]
[[row[i] for row in mat] for i in range(len(mat[0]))]
# Above list comprehension inverts the matrix
# :)To avoid apprehension when nesting list comprehensions,
#    read them from right to left. :)

dups in a list

dups = set([x for x in l if l.count(x) > 1])

zip

x = ['1', '2', '3']
y = ('4', '5', '6')
z = "789"
zip(x, y, z)
# [('1', '4', '7'), ('2', '5', '8'), ('3', '6', '9')]
# returns a list of tuples, where the i-th tuple contains the i-th
#   element from each of the argument sequences or iterables.

OrderedDict

from collections import OrderedDict
validators = OrderedDict()

validators['IS_ALPHANUMERIC']="Checks that a field value contains only characters in the ranges a-z, A-Z, or 0-9."

validators['IS_DATE']="Checks that a field value contains a valid date in the specified format."

validators['IS_DATE_IN_RANGE']="Works like the IS_DATE validator. Allows specifying a range."

for k, v in validators.items():
    print k, '=', v, '\n'
OUTPUT:
IS_ALPHANUMERIC = Checks that a field value contains only characters in the ranges a-z, A-Z, or 0-9.

IS_DATE = Checks that a field value contains a valid date in the specified format.

IS_DATE_IN_RANGE = Works like the IS_DATE validator. Allows specifying a range.

sorted dict print formatted

cnid = chordNameIntervalDict= {
    'maj':    (0,  4,  7),
    'min':    (0,  3,  7),
    'aug':    (0,  4,  8),
    'dim':    (0,  3,  6),
    'sus2':   (0,  2,  7),
    'sus4':   (0,  5,  7),
    '6':      (0,  4,  7,  9),
    'm6':     (0,  3,  7,  9),
    '7':      (0,  4,  7, 10),
    'maj7':   (0,  4,  7, 11),
    'm7':     (0,  3,  7, 10),
    'dim7':   (0,  3,  6, 10),
    }

#make the keys be the vals and the vals the keys
icnd = intervalChordNameDict = dict([(cnid[k],k) for k in cnid.keys()])

chordNameL = 'maj,min,aug,dim,sus2,sus4,6,m6,7,maj7,m7,dim7'.split(',')

print 'cnid'
for k in chordNameL:
    print ('%7s %s')%(str(k),str(cnid[k]))

print 'icnd'
for k in sorted(icnd):
    print ('%-16s %s ')%(k, icnd[k])

Strings Back to Contents

concat strings

''.join([xStr, yStr])

concat strings [s = concat(s,x)]

xStr = ''.join([xStr, yStr])

for lines in string

keepends = True
for line in str.splitlines(keepends):
    process (line)

string.replace

s = 'spam bacon ham spam ham bacon spam'
s.replace('spam', 'eggs',1) #one
s.replace('spam', 'eggs')   #all

string2list

L = list(s)

string2list [split]

s = 'answerer, client, linesperson, driver'
L = s.split(', ')
print '\n'.join(L)
answerer
client
linesperson
driver

list2string

s = ''.join(L)

format see “format examples”

menuTemplStr = "(T('{0}'), False, URL('default', '{0}'), []),\n"
print menuTemplStr.format('answerer')
(T('answerer'), False, URL('default', 'answerer'), []),

s = 'answerer, client, linesperson, driver'
v = [menuTemplStr.format(itm) for itm in s.split(", ")]
for i in v:
    print i
(T('answerer'), False, URL('default', 'answerer'), []),

(T('client'), False, URL('default', 'client'), []),

(T('linesperson'), False, URL('default', 'linesperson'), []),

(T('driver'), False, URL('default', 'driver'), []),

enum_string 2 dict

enum_string = es = "state, county, city_state, city_name, city_url"
ed = dict(zip(es.split(", "), range(len(es))))
print ed
{'county': 1, 'city_name': 3, 'state': 0, 'city_url': 4, 'city_state': 2}

Thousands Comma Separator

New in 2.7 when formatting an integer, include the comma after the width:

>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'

Directories + Files Back to Contents

File Admin

This is all over the place see:
Directory Manipulations – Dive Into Python
fnmatch – file name match
glob
shutil
os.path
Catch All == docs.python 10. File and Directory Access

Join Paths

mid_path =  os.path.abspath(os.path.join(nwctxtDirPath, '..', 'mid'))

Delete Dir (Tree)

import shutil
shutil.rmtree(dirpath)

Delete File

import os
os.remove(filepath)

create a clean directory

# make a cleared out place to store stuff
import shutil
if os.path.isdir(dirpath):    
    shutil.rmtree(dirpath)
    os.mkdir(dirpath)

pwd

import os
os.path.abspath(os.curdir)

print all *.log files in dir

import glob, os
for filepath in glob.glob(os.path.join(myindirpath, "*.log")):
    print filepath

sys.path.append

import sys
if not('.' in sys.path): sys.path.append('.')

copy all .txt files in ‘.’ into ‘./example_dir’

import os, fnmatch, shutil
for filename in os.listdir('.'):
    if fnmatch.fnmatch(filename, '*.txt'):
        if not os.path.isdir(filename): shutil.copy(filename, 'example_dir')

Split Path Components – os.path

filepath = r'C:\1d\go\nonselenium\db_init_pj\db_init.py'
dirpath, filename = os.path.split(filepath)
fn_base, fn_ext = os.path.splitext(filename)
drive, pathbase = os.path.splitdrive(dirpath)

print "OUTPUT:\n filepath = %s\n dirpath = %s\n drive = %s\n pathbase = %s\n filename = %s\n fn_base = %s\n fn_ext = %s\n"%(filepath, dirpath, drive, pathbase, filename, fn_base, fn_ext)
OUTPUT:
 filepath = C:\1d\go\nonselenium\db_init_pj\db_init.py
 dirpath = C:\1d\go\nonselenium\db_init_pj
 drive = C:
 pathbase = \1d\go\nonselenium\db_init_pj
 filename = db_init.py
 fn_base = db_init
 fn_ext = .py

Copy Over Dir Tree

import os, shutil

def update_input():
    source_path = 'F:\\1d\\pythonPjs\\ScramblePj\\Scramble'
    dest_path = 'F:\\1d\\pythonPjs\\cxfreezePjs\\ScrambleFrzPj\\ScrambleFrz\\input\\Scramble' 

    if os.path.exists(dest_path):
        shutil.rmtree(dest_path)

    # This copy leaves svn directories out of the destination
    shutil.copytree(source_path, dest_path, ignore=shutil.ignore_patterns('*.svn'))

if __name__ == '__main__':
    update_input()
    raw_input('hit return to quit')

cd ls isdir filesize

import os
os.chdir(r"C:\1j\1podcasts")
dirlisting = os.listdir('.')
for i in dirlisting:
    subpath = './%s'%(i)
    if os.path.isdir(subpath):
        sublisting = os.listdir(subpath)
        for s in sublisting:
            size = os.path.getsize(subpath+'/'+s)
            print '%35s   %20s %s'%(i, size, s)

Dir Tree Walk

# Notes for the code
'''
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

Generates the file names in a directory tree by walking the tree either top-down or bottom-up. 

For each directory in the tree rooted at directory top (including top itself), 
it yields a 3-tuple</strong> (dirpath, dirnames, filenames).

The following example displays the number of bytes taken by non-directory file
in each directory under the starting directory, except that it doesn’t look under any CVS subdirectory.
'''
import os
from os.path import join, getsize
for dirpath, dirs, files in os.walk('python/Lib/email'):
    print dirpath, "consumes",
    print sum(getsize(join(dirpath, name)) for name in files),
    print "bytes in", len(files), "non-directory files"
    if 'CVS' in dirs:
        dirs.remove('CVS')  # don't visit CVS directories

Split Path Components (Old Way) – See stack.oflow

drive,path_and_file=os.path.splitdrive(path)
dirpath,file=os.path.split(path_and_file)
filename_and_ext_list = file.split(os.extsep)
def split_folders(dirpath):
    path = dirpath
    folders=[]
    while 1:
        path,folder=os.path.split(path)
        if folder!="":
            folders.append(folder)
        else:
            if path!="":
                folders.append(path)
            break
    r = folders[::-1]  # reverses folders
    return r
folders = split_folders(dirpath)

Admin, os, sys Back to Contents

Python Bash command – Checks if file exists

python -c "import os.path; print os.path.isfile('/path_to/file.xxx')"

Run Shell Commands – See Theory subprocess [NOT commands]

Reality This works!
cmd = 'E:\\Python27\\Scripts\\cxfreeze.bat Scramble\\bin\\cgi\\ende.py --target-dir Scramble\\dist-cgi\\bin\\cgi'
print cmd
os.system(cmd)

Theory
>>> retcode = subprocess.call(["ls", "-l"]) # WAIT 2 Complete - no output

>>> subprocess.check_output(["ls", "-l", "/dev/null"]) # WAIT 2 Complete - returns output
'crw-rw-rw- 1 root root 1, 3 Oct 18  2007 /dev/null\n'

See also: Replacing Older Functions... and Convenience Functions

Timestamp

## time & formatted
# for formatting examples see http://strftime.org/
import time
time.strftime('%y%m%d_%H.%M.%S_%a', time.localtime())
#out: '150217_08.21.18_Tue'

## datetime
import datetime
str(datetime.datetime.now()).replace(':', '.').replace(' ', '_')
#out: 2011-05-30_11.32.56.375000
[no colons or spaces -> good 4 file names]

## 2 Timestamps + duration
import datetime

dt_begin = datetime.datetime.now()
# DO YOUR STUFF IN HERE
dt_end = datetime.datetime.now()

print "End Timestamp: %s"%(str(dt_end).replace(':', '.').replace(' ', '_'))
print "Begin Timestamp: %s"%(str(dt_begin).replace(':', '.').replace(' ', '_'))
print " (End - Begin): %s"%(dt_end - dt_begin)

OUTPUT:
End Timestamp: 2015-09-09_07.45.25.953000
Begin Timestamp: 2015-09-09_07.32.37.656000
(End - Begin): 0:12:48.297000

time delta

from time import time
t0 = time()
print "t0 = %s"%(t0)

def genChordName2PianokeyOctavesDict():
    for chName, pkTup in chordName2pianoKeyDict.iteritems():
        print "loop begin time()-t0 = %s"%(time()-t0)
        pkL = list(pkTup)

        #lower Octaves
        lowerL = list(pkL)
        while True:
            print "lower while begin time()-t0 = %s"%(time()-t0)
            lowerL = [pk-12 for pk in lowerL]
            if min(lowerL)  127:
                break
            chordName2PianokeyOctavesDict[chName] = higherL
        print "loop end time()-t0 = %s"%(time()-t0)

chordName2PianokeyOctavesDict = OrderedDict({})        
genChordName2PianokeyOctavesDict()

Control Flow Back to Contents

Conditional Expressions

x = true_value if condition else false_value

looping dicts

for k, v in knights.iteritems():
    print k, v

looping enumerate sequences

for i, v in enumerate(Seq):
    print i, v

while True … break

while True:
    if min(lowerL) < 0:
        break

continue

for num in range(2, 10):
    if num % 2 == 0:
        print "Found an even number", num
        continue
    print "Found a number", num

try except

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except IOError as e:
    print "I/O error({0}): {1}".format(e.errno, e.strerror)
except ValueError:
    print "Could not convert data to an integer."
except:
    print "Unexpected error:", sys.exc_info()[1]
    raise

raise an exception

def getFolderName(dt_element):
    if isFolder(dt_element):
        return dt_element.getchildren()[0].text
    else:
        raise Exception('Element is NOT a folder.')

yield

def genBarItems(self):
    rval = ()
    for staffIx, staff in enumerate(self.staves):
        BARS = 1
        for barIx, bar in enumerate(staff[BARS]):
            for itIx, it in enumerate(bar):
                rval = (staffIx, barIx, itIx, it)
                yield rval

Introspection Back to Contents

type checking

see stackOverflow: Python canonical type checking

# checking a music21 type
from music21  import chord

if type(itm) is chord.Chord:
    ch = itm
    ...

A function to aid introspection

# from: http://www.diveintopython.net/power_of_introspection/index.html#apihelper.divein
#          Example 4.1. apihelper.py
# also google: python class introspection 
# also see: http://www.ibm.com/developerworks/library/l-pyint/index.html 

def info(object, spacing=10, collapse=1): 
    """
    Print methods and doc strings. 
    Takes module, class, list, dictionary, or string.
    Usage:
        >>> li = []
        >>> info(li)
    """ 
    methodList = [method for method in dir(object) if callable(getattr(object, method))] 
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) 
    print "\n".join(["%s %s" % 
        (method.ljust(spacing),
        processFunc(str(getattr(object, method).__doc__)))
        for method in methodList])

Big Templates Back to Contents

class

See also:

Python 3 – Object Oriented
Python 3 – The Python Tutorial – 9. Classes
“Python Course.eu”; Python 3; Object-Oriented Programming

#from http://www.ibiblio.org/g2swap/byteofpython/read/inheritance.html
class SchoolMember(object):
    '''Represents any school member.'''
    # class variables go here
    school = 'mySchool'
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print '(Initialized SchoolMember: %s)' % self.name

    def tell(self):
        '''Tell my details.'''
        print 'School:"%s" Name:"%s" Age:"%s"' % (SchoolMember.school, self.name, self.age),

class Teacher(SchoolMember):
    '''Represents a teacher.'''
    def __init__(self, name, age, salary):
        SchoolMember.__init__(self, name, age)
        self.salary = salary
        print '(Initialized Teacher: %s)' % self.name

    def tell(self):
        SchoolMember.tell(self)
        print 'Salary: "%d"' % self.salary

class Student(SchoolMember):
    '''Represents a student.'''
    def __init__(self, name, age, marks):
        SchoolMember.__init__(self, name, age)
        self.marks = marks
        print '(Initialized Student: %s)' % self.name

    def tell(self):
        SchoolMember.tell(self)
        print 'Marks: "%d"' % self.marks

t = Teacher('Mrs. Shrividya', 40, 30000)
s = Student('Swaroop', 22, 75)

print # prints a blank line

members = [t, s]
for member in members:
    member.tell() # works for both Teachers and Students

# here's the output:
(Initialized SchoolMember: Mrs. Shrividya)
(Initialized Teacher: Mrs. Shrividya)
(Initialized SchoolMember: Swaroop)
(Initialized Student: Swaroop)

School:"mySchool" Name:"Mrs. Shrividya" Age:"40" Salary: "30000"
School:"mySchool" Name:"Swaroop" Age:"22" Marks: "75"

Main

#!/usr/bin/python
#! python3
#! python2
# -*- coding: utf-8 -*-
"""example.py DoesSomething to INFILEPATH Producing OUTFILEPATH
Usage:   example.py INFILEPATH OUTFILEPATH
Example: example.py myInFile     myOutfile
"""
import sys

def myFunc(myArg1, myArg2):
    s = raw_input('input a string')
    print (s)

NUM_ARGS = 2
def main():
    args = sys.argv[1:]
    if len(args) != NUM_ARGS or "-h" in args or "--help" in args:
        print (__doc__)
        sys.exit(2)
    myFunc(args[0], args[1])

if __name__ == '__main__':
    main()

GUI

Here’s what this will look like. The code follows.

gui-screen-shot

# -*- coding: ISO-8859-1 -*-
import sys, time

if not('.' in sys.path): sys.path.append('.')
import midi24txt 

from Tkinter import *
from tkFileDialog import *

# thinking in tkinter http://www.ferg.org/thinking_in_tkinter/all_programs.html

class TheGui:
    def __init__(self, parent):
        #------- frmSetup ----------#
        self.frmSetup = Frame(parent, bd=5)
        self.frmSetup.pack()

        self.inChoices = ('Text', 'Midi')
        self.varRadio = IntVar()

        self.r1 = Radiobutton(self.frmSetup, text="Convert Text INPUT into Midi OUTPUT",
            variable=self.varRadio, value=0, command=self.selRadio)
        self.r1.pack(anchor=W)

        self.r2 = Radiobutton(self.frmSetup, text="Convert Midi INPUT into Text OUTPUT",
            variable=self.varRadio, value=1, command=self.selRadio)
        self.r2.pack(anchor=W)
        #------- frmSetup ----------#

        sep = Frame(parent, width=1, bd=5, bg='black')
        sep.pack(fill=X, expand=1)

        #------- frmIn ----------#
        # http://effbot.org/tkinterbook/tkinter-widget-styling.htm
        self.frmIn = Frame(parent, bd=5)
        self.frmIn.pack()

        self.lblIn = Label(self.frmIn, text='Text Input File Path', width=20)
        self.lblIn.pack(side=LEFT)  

        self.inFilePath = StringVar() # http://effbot.org/tkinterbook/entry.htm
        self.entIn = Entry(self.frmIn, width=20, textvariable=self.inFilePath)
        self.entIn.pack(side=LEFT)

        self.btnIn = Button(self.frmIn, text='Browse', command=self.btnInBrowseClick)
        self.btnIn.pack(side=LEFT)
        #------- frmIn ----------#

        #------- frmOut ----------#
        self.frmOut = Frame(parent, bd=5)
        self.frmOut.pack()

        self.lblOut = Label(self.frmOut, text='Midi Output File Path', width=20)
        self.lblOut.pack(side=LEFT) 

        self.outFilePath = StringVar()
        self.entOut = Entry(self.frmOut, width=20, textvariable=self.outFilePath)
        self.entOut.pack(side=LEFT) 

        self.btnOut = Button(self.frmOut, text='Browse', command=self.btnOutBrowseClick)
        self.btnOut.pack(side=LEFT)
        #------- frmOut ----------#

        sep = Frame(parent, width=1, bd=5, bg='black')
        sep.pack(fill=X, expand=1)

        #------- frmButtons ----------#
        self.frmOut = Frame(parent, bd=5)
        self.frmOut.pack()

        self.btnConvert = Button(self.frmOut, text='Convert', command=self.btnConvertClick)
        self.btnConvert.pack()  

    #------- handle commands ----------#
    def selRadio(self):
        self.lblIn.config(text = self.inChoices[self.varRadio.get()] + ' Input File Path')
        self.lblOut.config(text = self.inChoices[(self.varRadio.get()+1)%2] + ' Output File Path')
        print str(self.varRadio.get())

    def btnInBrowseClick(self):
        rFilepath = askopenfilename(defaultextension='*',
            initialdir='.', initialfile='', parent=self.frmIn, title='select a file')
        self.inFilePath.set(rFilepath)
        print self.entIn.get()

    def btnOutBrowseClick(self):
        rFilepath = asksaveasfilename(defaultextension='*',
            initialdir='.', initialfile='', parent=self.frmIn, title='select a file')
        self.outFilePath.set(rFilepath)
        print self.entOut.get()

    def btnConvertClick(self):
        #defClr = self.btnConvert.cget("bg")
        self.btnConvert.config(relief=SUNKEN)
        self.btnConvert.update()
        #print 'Convert from %s to %s' % (self.inChoices[self.varRadio.get()], self.inChoices[(self.varRadio.get()+1)%2])
        print 'self.varRadio.get()', self.varRadio.get()

        if self.varRadio.get() == 0:
            inputTextFilePath = str(self.inFilePath.get()); outputMidiFilePath = str(self.outFilePath.get())
            print 'midi 4 txt', inputTextFilePath, outputMidiFilePath
            midi24txt.mid4txt(inputTextFilePath, outputMidiFilePath)
        else:
            inputMidiFilePath = str(self.inFilePath.get()); outputTextFilePath = str(self.outFilePath.get())
            print 'midi 2 txt', inputMidiFilePath, outputTextFilePath
            midi24txt.mid2txt(inputMidiFilePath, outputTextFilePath)
        time.sleep(0.5)
        self.btnConvert.config(relief=RAISED)
        self.btnConvert.update()

root = Tk()
root.title("Convert between Midi and Text Files")
#http://infohost.nmt.edu/tcc/help/pubs/tkinter/std-attrs.html#geometry
#http://infohost.nmt.edu/tcc/help/pubs/tkinter/toplevel.html
root.geometry("350x200+10+10")
gui = TheGui(root)
root.mainloop()

cgi

#!/usr/bin/env python
# from: http://webpython.codepoint.net/cgi_file_upload
import cgi, os
import cgitb; cgitb.enable()

try: # Windows needs stdio set for binary mode.
    import msvcrt
    msvcrt.setmode (0, os.O_BINARY) # stdin  = 0
    msvcrt.setmode (1, os.O_BINARY) # stdout = 1
except ImportError:
    pass

form = cgi.FieldStorage()

def upload():
    """ upload the file into files/ """
    fileitem = form['file']

    # Test if the file was uploaded
    if fileitem.filename:

       # strip leading path from file name to avoid
       #    directory traversal attacks
       fn = os.path.basename(fileitem.filename)
       open('files/' + fn, 'wb').write(fileitem.file.read())
       message = 'The file "' + fn +
               '" was uploaded successfully'

    else:
       message = 'No file was uploaded'

    print """\
    Content-Type: text/html\n

%s

    """ % (message,)

def main():
    #cgi.test()
    message = 'from main'
    for k in form.keys():
        if k != 'file':
            message = ''.join([message,
                k+': '+form.getvalue(k)+''])
     print """\
    Content-Type: text/html\n

%s

    """ % (message,)

main()

Modules Back to Contents

File Admin Module

'''fa - the File Admin Module
fa encapsulates some code from the "Admin, os, sys" section of my blog.
See https://joecodeswell.wordpress.com/python-notes/#Admin
'''
import os, shutil, time

def copy_all_files(source_dir_path, dest_dir_path, verbose=False):
    ''' copies all files in the source_dir into the dest_dir
    >>> os.mkdir('./test/out/d4')
    >>> fa.copy_all_files('./test/in', './test/out/d4')
    '''
    assert(os.path.isdir(source_dir_path) and os.path.isdir(dest_dir_path))
    for filename in os.listdir(source_dir_path):
        if not os.path.isdir(os.path.join(source_dir_path,filename)):
            shutil.copy(os.path.join(source_dir_path,filename), dest_dir_path)
    if verbose: print 'All files in %s have been copied into %s .'%(source_dir_path, dest_dir_path)

def delete_all_files(dir_path, verbose=False):
    ''' deletes all files in the dir - NOT RECURSIVE - NOT DIRECTORIES 
    >>> fa.delete_all_files('./test/out/d4')
    '''
    assert(os.path.isdir(dir_path))
    if verbose:
        yn = raw_input('delete all files in %s ? [y or n] '%(dir_path))
        while ((yn.lower() != 'y') and (yn.lower() != 'n')):
            yn = raw_input('delete all files in %s ? [y or n] '%(dir_path))             
        if yn.lower == 'n': return
    for filename in os.listdir(dir_path):
        if not os.path.isdir(os.path.join(dir_path,filename)):
            print 'deleting %s'%(os.path.join(dir_path,filename))
            os.remove(os.path.join(dir_path,filename))
    if verbose: print 'All files in %s have been deleted.'%(source_dir_path, dest_dir_path)

def copy_over_dir_tree(source_dir_path, dest_dir_path, verbose=False):
    ''' RECURSIVELY copy the source_dir OVER the dest_dir replacing it.
    >>> fa.copy_over_dir_tree('./test/in', './test/out/d4')
    '''
    assert(os.path.isdir(source_dir_path) and os.path.isdir(dest_dir_path))
    if os.path.exists(dest_dir_path):
        shutil.rmtree(dest_dir_path)
    shutil.copytree(source_dir_path, dest_dir_path)
    if verbose: print 'The dir tree %s has copied over %s .'%(source_dir_path, dest_dir_path)

### this needs work
##def wait_while_open(file_path, verbose=False):
##    ''' waits while the file is open
##    >>> fa.wait_while_open('./test/in/d1/f1.txt', True)
##    '''
##    assert(os.path.isfile(file_path))
##    is_open = True   #assume it is open
##    while is_open:
##        if verbose: print 'waiting for %s'%(file_path)
##        time.sleep(1)  # sleep for 1 second
##        try:
##            t = open(file_path, "w")
##            t.close()
##            is_open = False
##        except IOError:
##            continue

if __name__ == "__main__":
    print '**running standard doctest'
    import doctest,fa
    os.mkdir('./test')
    os.mkdir('./test/in')
    os.mkdir('./test/out')
    f = open('./test/in/f1.txt', 'w'); f.write('This is test file 1\n'); f.close()
    f = open('./test/in/f2.txt', 'w'); f.write('This is test file 2\n'); f.close()
    f = open('./test/in/f3.txt', 'w'); f.write('This is test file 3\n'); f.close()
    os.mkdir('./test/in/d1')
    os.mkdir('./test/in/d2')
    os.mkdir('./test/in/d3')
    f = open('./test/in/d1/f1.txt', 'w'); f.write('This is test file 1\n'); f.close()
    f = open('./test/in/d2/f1.txt', 'w'); f.write('This is test file 1\n'); f.close()
    f = open('./test/in/d3/f1.txt', 'w'); f.write('This is test file 1\n'); f.close()    

    doctest.testmod(fa)

Parsing Back to Contents

URL Parse

Source: SaltyCrane Blog

from urlparse import urlparse

url = 'http://www.gurlge.com:80/path/file.html;params?a=1#fragment'
o = urlparse(url)
print o.scheme
print o.netloc
print o.hostname
print o.port
print o.path
print o.params
print o.query
print o.fragment
print o.username
print o.password 

Yields:
http
www.gurlge.com:80
www.gurlge.com
80
/path/file.html
params
a=1
fragment
None
None

2 thoughts on “Python Notes

  1. Howdy, I think your web site might be having internet browser compatibility problems.

    When I look at your blog in Safari, it looks fine but when
    opening in I.E., it has some overlapping issues. I merely wanted to give you a quick heads up!
    Apart from that, wonderful site!

    • Dear b,

      Thanks for the heads up. Right now i am relying on WordPress.com for browser compatibility issues. Sorry about the overlapping. I am hoping it doesn’t cause too many problems.

      Thanks again, b.

      Love and peace,
      Joe

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s