我有这个代码,我正在阅读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']
[]
答案 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)
由于空数组是假的,它们不会被传递。