Python xlrd数组索引超出第二个文件的范围

Python xlrd数组索引超出第二个文件的范围,python,csv,xlrd,Python,Csv,Xlrd,我有一个包含5个以上无效CSV文件的目录。我没有问题读取文件,然后将它们作为“好”的CSV文件一次写入一个。但当我试图处理第二个文件时,我得到了“IndexError:数组索引超出范围” 导入xlrd 导入csv、系统、操作系统 导入日期时间、时间 导入日志记录 导入Gmail\u电子邮件 program=“cleansv” date=datetime.datetime(1899,12,30) argv0=“” argv1='c:/tmp/checkEmail/'#输入目录 argv2=“f:/

我有一个包含5个以上无效CSV文件的目录。我没有问题读取文件,然后将它们作为“好”的CSV文件一次写入一个。但当我试图处理第二个文件时,我得到了“IndexError:数组索引超出范围”

导入xlrd
导入csv、系统、操作系统
导入日期时间、时间
导入日志记录
导入Gmail\u电子邮件
program=“cleansv”
date=datetime.datetime(1899,12,30)
argv0=“”
argv1='c:/tmp/checkEmail/'#输入目录
argv2=“f:/foo/in/bar-”#输出目录
sys.argv=[argv0、argv1、argv2]
inDir=sys.argv[1]#输入目录
outDir=sys.argv[2]#输出目录
lList=[]#持有者列表,用于保存要处理的文件的名称
def processFiles():
try:#在lDir中创建本地文件列表,填充lList
如果os.listdir(inDir)=[]:#检查lDir中的文件
logging.info('没有要上载的文件')
退出()
其他:
对于os.listdir(inDir)中的文件名:
#打印文件名
如果os.path.isfile(inDir+文件名):
alist.append(文件名)#填充本地目录列表
如果lList中的“Thumbs.db:#删除windows Thumbs文件
list.remove('Thumbs.db')
logging.info('要检查的文件')
logging.info(“%s”,lList)
#打印lList,“lList”
除例外情况外,e:
Gmail_email.email(e,程序)
logging.warning('本地文件出错')
日志记录。警告('%s',e)
退出()
对于lList中的每个文件:#为lList中的每个文件调用清理方法
filePath=inDir+each
打印文件路径,“文件路径”
测试文件(文件路径)
def测试文件(文件路径):
尝试:
将open(filePath,“rb”)作为csvfile:
spamreader=csv.reader(csvfile,分隔符='',引号='|')
对于spamreader中的行:
#打印“很可能是好文件”
通过
除例外情况外,e:
logging.warning('本地文件出错')
日志记录。警告('%s',e)
#打印“清除坏文件”,文件路径
cleanBadFile(文件路径)
def cleanBadFile(文件路径):
timestr=time.strftime(“%Y%m%d-%H%m%S”)
#打印“试图清理的坏文件”
f=打开(outDir+timestr+“.csv”和“ab”)
试试看:#我能看一下文件吗
工作簿=xlrd.open_工作簿(文件路径)
#如果坏xlrd无法打开它,将在此处出错
打印工作簿。工作表名称()
#打印工作簿
除例外情况外,e:
#打印e,“错误”
通过
工作表=工作簿。按工作表名称(“工作表”)
num_rows=worksheet.nrows-1
num_cells=worksheet.ncols-1
#打印工作表.ncols,“单元格数”
当前行=-1
当curr_row
错误消息

Traceback (most recent call last):
  File "F:\cleanCSV.py", line 132, in <module>
    processFiles()
  File "F:\cleanCSV.py", line 51, in processFiles
    testFile(filePath)
  File "F:\cleanCSV.py", line 64, in testFile
    cleanBadFile(filePath)
  File "F:\cleanCSV.py", line 106, in cleanBadFile
    cell_type = worksheet.cell_type(curr_row, curr_cell)
  File "C:\Python27\lib\site-packages\xlrd\sheet.py", line 413, in cell_type
    return self._cell_types[rowx][colx]
IndexError: array index out of range
回溯(最近一次呼叫最后一次):
文件“F:\cleancvs.py”,第132行,在
processFiles()
processFiles中第51行的文件“F:\cleancvs.py”
测试文件(文件路径)
testFile中第64行的文件“F:\cleancvs.py”
cleanBadFile(文件路径)
文件“F:\cleancvs.py”,第106行,在cleanbad文件中
单元格类型=工作表。单元格类型(当前行,当前单元格)
文件“C:\Python27\lib\site packages\xlrd\sheet.py”,第413行,单元格类型
返回自我。单元格类型[rowx][colx]
索引器:数组索引超出范围

我觉得我需要“重置”一个计数变量,但我想我已经拥有了它们。我不知道该怎么办。

导致异常的行前面的两行
curr\u cell
被设置为-1,这不是有效的单元格索引。下面几行的注释表明您希望这是行中的第一个单元格,因此索引应该是0而不是-1。

我将+1(
curr\u cell+=1
)下移了3行

while curr_cell < num_cells:

                # Cell Types: 0=Empty, 1=Text, 2=Number, 3=Date, 4=Boolean, 5=Error, 6=Blank
                #print curr_row, "; ",curr_cell, " row and cell"
                cell_type = worksheet.cell_type(curr_row, curr_cell)
                cell_value = worksheet.cell_value(curr_row, curr_cell)
                print cell_type, ":", cell_value
                curr_cell += 1
                if cell_type == xlrd.XL_CELL_DATE:
                    cell_value=datetime.timedelta(int(cell_value))
                    cell_value = str(date + cell_value)[:10]
                    #print cell_value, "cell value, cell date"
当前单元格 #单元格类型:0=空,1=文本,2=数字,3=日期,4=布尔值,5=错误,6=空白 #打印当前行“;”,当前单元格,“行和单元格” 单元格类型=工作表。单元格类型(当前行,当前单元格) 单元格数值=工作表。单元格数值(当前行,当前单元格) 打印单元格类型“:”,单元格值 当前单元格+=1 如果单元格类型==xlrd.XL\u单元格日期: 总工程师
while curr_cell < num_cells:

                # Cell Types: 0=Empty, 1=Text, 2=Number, 3=Date, 4=Boolean, 5=Error, 6=Blank
                #print curr_row, "; ",curr_cell, " row and cell"
                cell_type = worksheet.cell_type(curr_row, curr_cell)
                cell_value = worksheet.cell_value(curr_row, curr_cell)
                print cell_type, ":", cell_value
                curr_cell += 1
                if cell_type == xlrd.XL_CELL_DATE:
                    cell_value=datetime.timedelta(int(cell_value))
                    cell_value = str(date + cell_value)[:10]
                    #print cell_value, "cell value, cell date"