Python:测试单元格是否为空时无限循环
Python: Infinite loop when testing if cell is empty
我是一名新程序员,正在尝试制作工具来简化我的工作。这是我的代码和我从中得到的错误。我的问题是,在用户输入 "empty" 时的循环处理中,它不会在最快的空单元格处停止,而是迭代到 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)
`
我猜您希望 cell_type
和 cell_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
好的,我找到答案了:
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
我仍然不确定为什么我以前的答案是错误的,但我接受了它并使用了与 "rows" 循环相同的格式。我认为这段代码实际上消除了对问题的需求,至少对我来说是这样。
我是一名新程序员,正在尝试制作工具来简化我的工作。这是我的代码和我从中得到的错误。我的问题是,在用户输入 "empty" 时的循环处理中,它不会在最快的空单元格处停止,而是迭代到 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)
`
我猜您希望 cell_type
和 cell_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
好的,我找到答案了:
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
我仍然不确定为什么我以前的答案是错误的,但我接受了它并使用了与 "rows" 循环相同的格式。我认为这段代码实际上消除了对问题的需求,至少对我来说是这样。