I know a code review wasn't the main goal of you message but I feel it's worth mentioning two tips:
On 22 December 2016 at 01:55, Deborah Swanson <pyt...@deborahswanson.net> wrote: > ls = [] > with open('E:\\Coding projects\\Pycharm\\Moving\\New Listings.csv', > 'r') as infile: > raw = csv.reader(infile) > indata = list(raw) > rows = indata.__len__() > for i in range(rows): > ls.append(indata[i]) This block init an empty list, creates a csv.reader, processes it all converting to a list then loops over every in this list and assign this item to the initially created list. The initial list object is actually useless since at the end ls and rows will contain exactly the same objects. Your code can be simplified with: with open(your_file_path) as infile: ls = list(csv.reader(infile)) Then I see you're looping with an index-based approach, here > for i in range(rows): > ls.append(indata[i]) […] > # find & mark dups, make hyperlink if not dup > for i in range(1, len(ls) - 1): and in the other functions, basically wherever you use len(). Check Ned Batchelders's "Loop like a native" talk about that, there are both a webpage and a PyCon talk. By using "native" looping you'll get simplified code that is more expressive in less lines. -- Andrea -- https://mail.python.org/mailman/listinfo/python-list