【问题标题】:List index out of range in python writing the file to csvpython中的列表索引超出范围将文件写入csv
【发布时间】:2017-05-11 08:58:39
【问题描述】:

我正在将文件写入 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

【问题讨论】:

  • 总是在问题中添加 FULL 错误消息(回溯) - 有很多有用的信息 - 即。哪条线有问题,等等。
  • IndexError Traceback (最近一次调用最后) in () 15 iter = re.finditer(regex, v) 16 if iter: ---> 17 idx = [i for i in iter][0].start() 18 文件名,时间戳 = v[:idx],v[idx:-4] 19 打印文件名,时间戳 IndexError: list index out of range
  • 添加有问题的Traceback - 它将更具可读性,每个人都会阅读它。

标签: python regex python-2.7 csv


【解决方案1】:
iter = re.finditer(regex, v)
        if iter:

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

您应该将代码更改为:

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

findall 会返回一个可以作为测试条件的列表。

【讨论】:

    【解决方案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]

    【讨论】:

    • 很抱歉,我还不太明白如何在我的代码中使用 finditer()。
    • @Akhil Kodicherla 迭代器不应用作测试条件,它将始终返回 True。
    猜你喜欢
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2012-10-13
    • 1970-01-01
    相关资源
    最近更新 更多