Index:


Python

Random bits of Python!

  • print_rfc_or_draft

    This is a simple program that prints an Internet Draft (ID) or RFC.

     

    Because of the difference between the number of lines on laser printers and line / dot-matrix printers, each “page” of the draft actually takes up 2 pages and you end up with lots of pages with just a one line footer.

    This script tries to fix that by downloading the draft, converting it to a PDF and then printing it.

     

      This script prints an Internet Draft (or RFC). It does this by
      reading the file (possibly first fetching it from the Internet),
      converting it to a PDF (and doing basic munging on it and then
      sending the PDF to lpr to actually do the printing.
    
      Usage:
        -F, --file <filename>  -- print this local file.
        -O, --outdir <dir>     -- save the converted PDF in this dir.
        -h, --help             -- this help.
        <url>                  -- fetch (and print) the file at the URL.
      Example:
          ./print_rfc_or_draft.py  http://tools.ietf.org/rfc/rfc5635.txt
             Fetches and prints RFC5635 from the ietf.org site and prints it.
    
          ./print_rfc_or_draft.py -F ~wkumari/docs/IETF/MyDrafts/deprecate-as-sets-00.txt
             Prints the local file called deprecate-as-sets-00.txt.
    

     

    Source is: print_rfc_or_draft.py

  • Python: Setting up logging.

    I like the Python logging module, but for some reason I always have issues remembering how to set it up. This is my cheat sheet:

    import logging
    logger = logging.getLogger('App Name')
    def SetupLogging():
    logger.setLevel(logging.DEBUG)
    #create console handler and set level to debug
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    #create formatter
    # was:%(asctime)s - %(name)s - %(levelname)s: %(message)s"
    formatter = logging.Formatter("%(levelname)s(%(name)s): %(message)s")
    #add formatter to ch
    ch.setFormatter(formatter)
    #add ch to logger
    logger.addHandler(ch)
    logger.error("Whoops, an error!")
    logger.debug ("Doing something boring")

    The formatter options are:

    %(name)s            Name of the logger (logging channel)
    %(levelno)s Numeric logging level for the message (DEBUG, INFO,
    WARNING, ERROR, CRITICAL)
    %(levelname)s Text logging level for the message ("DEBUG", "INFO",
    "WARNING", "ERROR", "CRITICAL")
    %(pathname)s Full pathname of the source file where the logging
    call was issued (if available)
    %(filename)s Filename portion of pathname
    %(module)s Module (name portion of filename)
    %(lineno)d Source line number where the logging call was issued
    (if available)
    %(created)f Time when the LogRecord was created (time.time()
    return value)
    %(asctime)s Textual time when the LogRecord was created
    %(msecs)d Millisecond portion of the creation time
    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
    relative to the time the logging module was loaded
    (typically at application startup time)
    %(thread)d Thread ID (if available)
    %(process)d Process ID (if available)
    %(message)s The result of record.getMessage(), computed just as
    the record is emitted

     

  • Python: Making a dictionary of lists (a hash of arrays!)

    One of the standard Perl tricks is making a hash of arrays (pun intended!).

    In Python this is a little trickier.

    For example, you read in a file of the form: device location — you will often need to to something like get all of the devices in New York, so you want to be able to do something like:

    ny_devices = device_list["ny"]

    The first thing you try is:

    (device, location) = line.split(" ")
    device_list[location].append(device)

    This dies with: KeyError: ‘ny’ — this is because the key “ny” doesn’t exist yet.

    One way to deal with this is:

    (device, location) = line.split(" ")
    if location not in device_list:
    # Add empty list for location
    device_list[location] = []
    device_list[location].append(device)

    A much cleaner way to do this is:

    device_list.setdefault(location,[]).append(device)