Python:测试单元格是否为空时的无限循环

时间:2015-02-13 15:29:14

标签: python excel while-loop xlrd xlwt

我是一个新的程序员,正在努力制作工具以使我的工作更轻松。这是我的代码和我从中得到的错误。我的问题是,在用户输入“空”时的循环处理中,它不会停在最快的空单元格中,而是迭代到xlwt可以处理的行数的末尾(65536)。该代码构建为仅故意处理一列。

这是错误:

  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)

`这是代码(由于我所做的编辑,我的一些评论不准确):

#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)

`

2 个答案:

答案 0 :(得分:1)

我猜你希望cell_typecell_x始终是i,0处单元格的类型和值,即使i发生变化也是如此。如果是这样,您应该在while循环中分配它们,而不是在外部。

    while t>0:
        cell_type = sh.cell_type(i,0)
        cell_x=sh.cell_value(i,0)
        if cell_type == xlrd.XL_CELL_EMPTY:
            t=0
        else:
            new_cell=[]
            cell_str=cell_x
        #...etc

答案 1 :(得分:0)

好的,我找到了答案:

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

我仍然不确定为什么我之前的答案是错误的,但是我把它吸了起来并使用与&#34;行相同的格式&#34;环。我认为这段代码实际上消除了对问题的需求,至少对我来说是这样。