在python中读取csv文件时列出索引超出范围错误

时间:2017-07-06 20:45:45

标签: python csv

我有这个代码,我正在阅读csv文件,使用NamedTemporaryFile来更改csv文件的内容。

def update_localcsv():

    ping = ["Yes","No"]
    filename = 'file1.csv'
    tempfile = NamedTemporaryFile(mode= 'w',delete=False)

    with open(filename, 'rt') as csvFile, tempfile:
        reader = csv.reader(csvFile, delimiter=',', quotechar='"')
        writer = csv.writer(tempfile, delimiter=',', quotechar='"')

        for row in reader:

            print(row)
            row[0] = random.choice(ping)

            curr_time = datetime.datetime.time(datetime.datetime.now()).strftime('%I:%M %p')
            row[1] = str(curr_time)
            print('current time: '+str(curr_time))
            print("New ping status = " + str(row))
            writer.writerow(row)

    shutil.move(tempfile.name, filename)

当我运行此代码时,我可以看到print(row)打印['Yes', '04:23 PM'],但它会在IndexError: list assignment index out of range处抛出row[0] = random.choice(ping)错误。

这是我的csv文件中的当前内容:

Yes,04:23 PM

为什么会出现这个错误?

注意:当我print(type(row))时,我得到<class 'list'>。我还看到一个空行被打印出来:

['Yes', '04:23 PM']
current time: 05:03 PM
New ping status = ['Yes', '05:03 PM']
[]

1 个答案:

答案 0 :(得分:1)

我能够通过在CSV文件末尾添加换行符来重现您看到的错误。我已经冒昧地相应地编辑了你的问题。

有一些简单的解决方案。最明显的是删除文件末尾的尾部换行符。

更强大的是跳过任何空行,或者没有您需要的两列的行。您可能仍希望将它们传递给输出编写器,因此您可以执行此操作(省略打印语句):

if len(row) == 2:
    row[0] = random.choice(ping)
    curr_time = datetime.datetime.time(datetime.datetime.now()).strftime('%I:%M %p')
    row[1] = str(curr_time)
writer.writerow(row)

如果要删除空行,可以为其添加单独的大小写:

if row:
    writer.writerow(row)

由于空数组是假的,它们不会被传递。