i'm a python newbie & wrote my first script, can someone critique it?

mad scientist jr mad.scientist.jr at gmail.com
Fri Jun 10 18:52:39 EDT 2016


Is this group appropriate for that kind of thing? 
(If not sorry for posting this here.)

So I wanted to start learning Python, and there is soooo much information online, which is a little overwhelming. I really learn best from doing, especially if it's something actually useful. I needed to create a bunch of empty folders, so I figured it was a good exercise to start learning Python. 
Now that it's done, I am wondering what kind of things I could do better. 
Here is the code: 

# WELCOME TO MY FIRST PYTHON SCRIPT!
# FIRST OF ALL, IT ***WORKS***!!! YAY!
# I AM A VBA AND JAVASCRIPT PROGRAMMER, 
# SO IT IS PROBABLY NOT VERY "PYTHONIC", 
# SO PLEASE FEEL FREE TO TEAR THE SCRIPT A NEW ONE
# AFTER YOU ARE SHOCKED BY THIS BAD CODE, 
# ALL I ASK IS THAT IF YOU THINK SOMETHING IS BAD, 
# PLEASE POST AN EXAMPLE OF THE "CORRECT" WAY OF DOING IT
# COMING FROM VBA, I KNOW A LITTLE OOP,
# BUT NOT C++ C# JAVA STUFF LIKE "INTERFACES" AND "ABSTRACT BASE CLASSES"
# SO IF YOU GET INTO SUCH TERMINOLOGY MY EYES MIGHT START TO GLAZE OVER
# UNLESS YOU CARE TO EXPLAIN THAT TOO

############################################################################################################################################################
# GLOBAL VALUES
sForPythonVersion="3"
#sFolderPathTemplate = "c:\\myscripts\\MP3 Disc <iCount/>"
sFolderPathTemplate = "c:\\temp\\MP3 Disc <iCount/>"
iFromCount = 1
iToCount = 250
iCountWidth = 3

################################################################################################################################################################
# SUPPORT FUNCTIONS

# //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
def is_string(myVar): # is_string IS MORE READABLE THAN isinstance (PLAIN ENGLISH!)
    #PYTHON 3 IS NOT LIKING THIS: return ( isinstance(myVar, str) or isinstance(myVar, unicode) )
    #PYTHON 3 IS NOT LIKING THIS: return isinstance(myVar, basestr)
    return isinstance(myVar, str)

# //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
# THIS IS SOME SAMPLE FUNCTION FROM A BOOK I AM READING "PYTHON IN EASY STEPS"
def strip_one_space(s):
    if s.endswith(" "): s = s[:-1]
    if s.startswith(" "): s = s[1:]
    return s

# //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
def get_exact_python_version():
    import sys
    sVersion = ".".join(map(str, sys.version_info[:3]))
    sVersion = sVersion.strip()
    return sVersion

# //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
# TO DO: RETURN TO THE LEFT OF FIRST "."
def get_python_version():
    sVersion = get_exact_python_version()
    return sVersion[0:1]

# //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
# CHECK PYTHON VERSION, IF IT'S WRONG THEN GRACEFULLY EXIT BEFORE IT BLOWS UP
# (DAMN, PYTHON 2.x STILL COMPLAINS WITH SYNTAX ERRORS!!)
# MAYBE THIS COULD STILL BE USEFUL FOR CHECKING THE SUB-VERSION, IN THAT CASE
# TO DO: MORE GRANULAR CHECK, EG IF VERSION >= 3.5.0
def exit_if_wrong_python_version(sRightVersion):
    import os
    sCurrentVersion = get_python_version()
    if (sCurrentVersion != sRightVersion):
        print("" +
              "Wrong Python version (" +
              sCurrentVersion +
              "), this script should be run using Python " +
              sRightVersion +
              ".x. Exiting..."
              )
        os._exit(0)

# //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
def get_script_filename():
    import os
    return os.path.basename(__file__)

# //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
def get_timestamp():
    import datetime
    return datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
    
# //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

def create_folder(sPath):
    import os
    import errno
    #if not os.path.exists(directory):
    #    os.makedirs(directory)
    try:
        os.makedirs(sPath, exist_ok=True)
    except OSError as exception:
        #if exception.errno != errno.EEXIST:
        print("ERROR #" + str(exception.errno) + "IN makedirs")
        raise
    
# //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

def create_folders(sFolderPathTemplate:str="", iFromCount:int=1, iToCount:int=0, iCountWidth:int=0):
    # MAKE SURE TEMPLATE'S A STRING. OH, IS THIS NOT "PYTHONIC"? WELL IT'S MORE READABLE
    if is_string(sFolderPathTemplate) == False:
        iFromCount = 1; iToCount = 0;
    
    sName = ""
    sCount = ""
    iLoop = iFromCount
    while (iLoop <= iToCount) and (len(sFolderPathTemplate) > 0):
        sCount = "{0}".format(iLoop)
        if (iCountWidth > 0):
            sCount = sCount.zfill(iCountWidth)
        sName = sFolderPathTemplate.replace("<iCount/>", sCount)
        create_folder(sName)
        iLoop = iLoop + 1

############################################################################################################################################################
# MAIN LOGIC

def main():
    # ----------------------------------------------------------------------------------------------------------------------------------------------------------------
    # MAKE SURE PYTHON VERSION IS CORRECT
    exit_if_wrong_python_version(sForPythonVersion)
    print("PYTHON VERSION (" + get_exact_python_version() + ") MATCHES REQUIRED VERSION (" + sForPythonVersion + ")")
    #print("get_python_version       returns \"" + get_python_version()       + "\"")
    #print("get_exact_python_version returns \"" + get_exact_python_version() + "\"")

    # ----------------------------------------------------------------------------------------------------------------------------------------------------------------
    # PRINT START TIMESTAMP
    print("" + get_timestamp() + " " + get_script_filename() + " STARTED.")

    # ----------------------------------------------------------------------------------------------------------------------------------------------------------------
    # DO WHAT WE CAME TO DO
    # IT'S PROBABLY BAD FORM TO REFERENCE GLOBAL VARIABLES INSIDE THE SCOPE OF A FUNCTION?
    # BUT I WANT TO MAKE IT EASY TO CONFIGURE THE SCRIPT JUST BY CHANGING A COUPLE OF LINES
    # AT THE TOP, WITHOUT HAVING TO SEARCH THROUGH THE CODE
    create_folders(
        sFolderPathTemplate,
        iFromCount,
        iToCount,
        iCountWidth)

    # ----------------------------------------------------------------------------------------------------------------------------------------------------------------
    # NOW FINISH
    print("" + get_timestamp() + " " + get_script_filename() + " FINISHED.")
    #import os
    #os._exit(0)

############################################################################################################################################################

main()



More information about the Python-list mailing list