Histogram of length of words in text
Reinderien has covered the PEP-8 style issues, so here's some input on the logic. 



Running the program (with the half of your question that isn't the code as an input) gives the following result:

This program is being run by itself
100 -|                                    
     |                                    
     |                                    
     |                                    
     |      ***   ***                     
     -|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|-
      0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
main function took 0.185 ms


So two obvious issues are that the X-axis should be one character further right and the numbers lose alignment. 

Per the specification you should be printing a table, not a histogram. 

Also, when adjacent columns are both filled it could get a bit confusing, perhaps a single-width column would be better?

100 -|                                    
     |                                    
     |                                    
     |                                    
     |       *     *                    
      -|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|-
       0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15




Short texts don't appear on the chart at all, and long texts could have more than 100 words of a given length - consider normalising your counts to the proportion of the input. 



You are replicating functionality that already exists in Python: collections.Counter would save you a lot of work. Keys that don't have counts will automatically return zero, for example, and you don't need insert_Dict:

out = read_string.translate(None, punc)
length_dict = Counter(map(len, out.split(" ")))  


Note that explicitly splitting on a single space means you don't have to handle the single punctuation characters separately:

&gt;&gt;&gt; "foo &amp; ba'r".translate(None, punc).split(" ")
['foo', '', 'bar']




Your main should look more like:

def main():
    with open(sys.argv[1]) as f:
        data = f.read()
    counts = create_counter(data)
    proportions = normalise_counts(counts) # if required
    draw_histogram(proportions)


Splitting the other functionality out into separate functions. 



Your histogram-drawing code uses a lot of explicit string concatenation. It is better to .format and .join strings (see string methods), for example:

print '       {0}'.format("".join(map("{0:&lt;3}".format, range(16))))


Which produces:

       0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15