将文件写入csv的python中列出索引超出范围

时间:2016-12-27 04:22:20

标签: python regex python-2.7 csv

我将文件写入csv,但它表示列表索引超出范围。这是我的代码。我有一个包含85个文件的目录。

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

2 个答案:

答案 0 :(得分:2)

finditer()返回一个迭代器,它的始终是真实的

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]

答案 1 :(得分:1)

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

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

您应该将代码更改为:

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

findall将返回一个可用作测试条件的列表。