Search code examples
pythonexcelwhile-loopxlrdxlwt

Python: Infinite loop when testing if cell is empty


I'm a new programmer messing around trying to make tools to make my job easier. Here is my code and the error I'm getting from it. My problem is that in the loop handling when the user inputs "empty", it doesn't stop at the soonest empty cell, but iterates to the end of the number of rows of what xlwt can handle(65536). The code is built to only handle one column on purpose.

This is the error:

  File "sentenceconverter.py", line 114, in <module>
db1.write(i,0,new_cell)
 File "C:\Python27\lib\site-packages\xlwt\Worksheet.py", line 1030, in write
self.row(r).write(c, label, style)
File "C:\Python27\lib\site-packages\xlwt\Worksheet.py", line 1078, in row
self.__rows[indx] = self.Row(indx, self)
File "C:\Python27\lib\site-packages\xlwt\Row.py", line 42, in __init__
raise ValueError("row index (%r) not an int in range(65536)" % rowx)
ValueError: row index (65536) not an int in range(65536)

`This is the code(some of my comments are not accurate because of edits I've done):

#import everything
    import xlrd
    import xlwt
    import sys
    from sys import argv
    import string

    #get workbooks from command line
    script,workbook1,destination = argv

    #set the limit of cells to loop through
    #cellnum=raw_input("How many cells do you want to work with?")

    #open the workbooks for working with
    wb=xlrd.open_workbook(workbook1)
    sh=wb.sheet_by_index(0)
    db=xlwt.Workbook()

    #manage db for writing
    db1=db.add_sheet('Definition')
    new_cell=[]
    cell_l=""
    printable=string.printable
    printable_n=printable.replace(".","").replace(":","").replace(string.lowercase,"").replace(string.uppercase,"")
    printable_m=printable_n
    #main loop
    i=0
    answer=raw_input("Til [empty] or til [row]?")
    if answer == "row":
        cellnum=raw_input("How many rows? do you want to work with?")
        while i<=(int(cellnum)-1):
            new_cell=[]
        #reference correct cell and convert it to string format from unicode
            cell_x=sh.cell_value(i,0)
            cell_str=cell_x


        #capitalize
            if cell_str[0].islower():
                cell_str_2=cell_str.capitalize()
            else:
                cell_str_2=cell_str
        #add period
            if any((c in printable_m) for c in cell_str_2[-1]):
        #if cell_str_2[-1].contains(printable_m):
                cell_str_f=cell_str_2[:-1]
                new_cell+=cell_str_f+"."+"\n"
            elif cell_str_2[-1]!="." and cell_str_2[-1]!=":":
                new_cell+=cell_str_2+"."+"\n"
            else:
                new_cell+=cell_str_2+"\n"

        #add cell to new sheet
            db1.write(i,0,new_cell)

        #iterate to next cell
            i+=1
    elif answer =="empty":
        cell_type = sh.cell_type(i,0)
        cell_x=sh.cell_value(i,0)
        t=1
        while t>0:
            if cell_type == xlrd.XL_CELL_EMPTY:
                t=0
            else:
                new_cell=[]
                cell_str=cell_x

        #capitalize
                if cell_str[0].islower():
                    cell_str_2=cell_str.capitalize()
                else:
                    cell_str_2=cell_str
        #add period
                if any((c in printable_m) for c in cell_str_2[-1]):
                    cell_str_f=cell_str_2[:-1]
                    new_cell+=cell_str_f+"."+"\n"
                elif cell_str_2[-1]!="." and cell_str_2[-1]!=":":
                    new_cell+=cell_str_2+"."+"\n"
                else:
                    new_cell+=cell_str_2+"\n"


        #add cell to new sheet
                db1.write(i,0,new_cell)

        #iterate to next cell
                i+=1
            #db1.write(i,0,new_cell)
    else:
        sys.exit("Didn't work. Make sure you input everything as prompted.")    

    #save and close
    db.save(destination)

`


Solution

  • Ok, I found the answer:

    elif answer =="empty":
        while i<=(sh.nrows-1):
           cell_type = sh.cell_type(i,0)
           cell_x=sh.cell_value(i,0)
           new_cell=[]
           .
           .
           db1.write(i,0,new_cell)
           i+=1
    

    I'm still not exactly sure why my previous answers were wrong but I sucked it up and used the same format as the "rows" loop. I think this code actually removes the need for the question, at least for my purposes.