2015-02-13 4 views
1

Я новый программист, пытающийся создать инструменты, облегчающие мою работу. Вот мой код и ошибка, из которой я получаю. Моя проблема заключается в том, что в обработке цикла, когда пользователь вводит «пустой», он не останавливается на скошенной пустой ячейке, но выполняет итерацию до конца количества строк того, что может обрабатывать xlwt (65536). Код предназначен для обработки только одного столбца.Python: Бесконечная петля при тестировании, если ячейка пуста

Это ошибка:

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) 

`

+0

Вы никогда ничего не меняете в условиях цикла while, так почему вы считаете, что цикл никогда не закончится? –

+0

где вы меняете 't'? –

+0

Попробуйте указать пример: [Short, Self Contained, Correct (Compilable)] (http://www.sscce.org) –

ответ

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 

Я до сих пор точно не знаю, почему мои предыдущие ответы были неправильными, но я сосал его и использовал тот же формат, как «строка» петля , Я думаю, что этот код действительно устраняет необходимость в вопросе, по крайней мере для моих целей.

1

Я предполагаю, что вы хотите, чтобы 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 
+0

Это дает мне ' "Traceback (самый последний вызов последнего): Файл "sentenceconverter.py", строка 76, в cell_type = sh.cell_type (я, 0) Файл" C: \ python27 \ Lib \ сайт -packages \ xlrd \ sheet.py ", строка 413, в cell_type return self._cell_types [rowx] [colx] IndexError: индекс индекса за пределами диапазона" ' Это та же ошибка, что и у меня до того, м спрашивать сейчас. – jh44tx

 Смежные вопросы

  • Нет связанных вопросов^_^