2016-12-27 64 views
0

我正在将文件写入csv,但它说列表索引超出范围。这是我的代码。我有一个85个文件的目录。列表索引超出范围在Python中将文件写入csv

import os 
import os.path 
import csv 
import re 
import calendar 
path = 'C:\\Users\\akhilpriyatam.k\\Desktop\\xls' 
text_files = [os.path.splitext(f)[0] for f in os.listdir(path)] 
for v in text_files: 
    os.chdir('C:\\Users\\akhilpriyatam.k\\Desktop\\xls') 
with open('file1.csv', 'wb') as csvfile: 
    thedatawriter = csv.writer(csvfile,delimiter=',') 
    for v in text_files: 
     months = list(calendar.month_name[1:]) 
     regex = re.compile('|'.join(months)) 
     iter = re.finditer(regex, v) 
     if iter: 
      idx = [i for i in iter][0].start() 
      filename, timestamp = v[:idx],v[idx:-4] 
      print filename, timestamp 
      thedatawriter.writerow([filename,timestamp]) 

这是错误。

IndexError         Traceback (most recent call last) 
<ipython-input-145-0b1c3f1407ed> in <module>() 
    15   iter = re.finditer(regex, v) 
    16   if iter: 
---> 17    idx = [i for i in iter][0].start() 
    18    filename, timestamp = v[:idx],v[idx:-4] 
    19    print filename, timestamp 

IndexError: list index out of range 
+0

总是添加问题** FULL **错误消息(追踪) - 有许多有用的信息 - 即。这使得线问题等 – furas

+0

IndexError回溯(最近最后调用) () 15 ITER = re.finditer(正则表达式,V) 16如果ITER: - - > 17 idx = [i for iter iter] [0] .start() 18 filename,timestamp = v [:idx],v [idx:-4] 19 print filename,timestamp IndexError:list index超出范围 –

+0

在问题中增加'Traceback' - 它会更具可读性,每个人都会阅读它。 – furas

回答

2

finditer()返回迭代和它的总是truthy

In [1]: import re 

In [2]: iter = re.finditer(r'[0-9]+', 'no digits here') 

In [3]: bool(iter) 
Out[3]: True 

换句话说,在if iter:检查会始终通过 - 即使没有匹配。而且,如果没有匹配项,则在访问空列表的第一个元素时出现IndexError[i for i in iter][0]

+0

我很抱歉,但我还没有完全理解如何在我的代码中使用finditer()。 –

+0

@Akhil Kodicherla迭代器不应该被用作测试条件,它总是会返回True。 –

1
iter = re.finditer(regex, v) 
     if iter: 

迭代器不应该被用作测试条件,它总是会返回True。

你应该你的代码更改为:

iter = re.findall(regex, v) 
      if iter: 

findall将返回它可以被用作测试条件的清单。