Python:testing单元格是否为空时为无限循环

我是一个新的程序员,试图使工具更容易工作。 这是我的代码和我从它得到的错误。 我的问题是,在循环处理时,当用户input“空”,它不会停在最早的空单元格,但迭代到xlwt可以处理(65536)的行数的末尾。 代码的构build目的只是处理一列。

这是错误的:

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) 

`

我猜你希望cell_xcell_x始终是i,0的单元格的types和值,即使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 

好的,我find了答案:

 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 

我仍然不确定为什么我以前的答案是错误的,但我吸了起来,并使用“行”循环相同的格式。 我认为这个代码实际上消除了这个问题的需要,至less对于我的目的来说。