【发布时间】:2017-09-11 11:34:21
【问题描述】:
在导入 Django 数据库之前,我必须清理一些文件。根据标题,我有一个错误,指出索引超出范围。我的文件有很多行,其中一些有 10.000 rws 或其他有更多。
Traceback (most recent call last):
File "/Users/cohen/my-python-project/venv/ofac/ofac_project/ofac_sdn/import_save/cleanup_sdn.py", line 9, in <module>
replaced7 = row[7].replace('-0-', newinteger)
IndexError: list index out of range
我该如何解决这个错误?尽管弹出了错误,但第一个文件被清理了,但其余的都没有。
提前谢谢你!
请在下面找到我的代码:
import csv, os, sys
newstring = "null"
newinteger = str(0)
newstring1= "null"
newstring2= "null"
newstring3= "null"
with open('sdn.csv', 'r') as file1, open('new_sdn.csv', 'w', newline='') as file2:
reader = csv.reader(file1, delimiter=',')
writer = csv.writer(file2, delimiter=',')
for row in reader:
replaced7 = row[7].replace('-0-', newinteger)
row[7]=replaced7
replaced8 = row[8].replace('-0-', newinteger)
row[8]=replaced8
replaced2 = row[2].replace('-0-', newstring)
row[2] = replaced2
replaced4 = row[4].replace('-0-', newstring)
row[4] = replaced4
replaced5 = row[5].replace('-0-', newstring)
row[5] = replaced5
replaced6 = row[6].replace('-0-', newstring)
row[6] = replaced6
replaced9 = row[9].replace('-0-', newstring)
row[9] = replaced9
replaced10 = row[10].replace('-0-', newstring)
row[10] = replaced10
replaced11 = row[11].replace('-0-', newstring)
row[11] = replaced11
writer.writerow(row)
with open('add.csv', 'r') as file3, open('new_add.csv', 'w', newline='') as file4:
reader1 = csv.reader(file3, delimiter=',')
writer1 = csv.writer(file4, delimiter=',')
for line in reader1:
replaced12 = line[2].replace('-0-', newstring1)
line[2] = replaced12
replaced13 = line[3].replace('-0-', newstring1)
line[3] = replaced13
replaced14 = line[4].replace('-0-', newstring1)
line[4] = replaced14
replaced15 = line[5].replace('-0-', newstring1)
line[5] = replaced15
writer1.writerow(line)
with open('alt.csv', 'r') as file5, open('new_alt.csv', 'w', newline='') as file6:
reader2 = csv.reader(file5, delimiter=',')
writer2 = csv.writer(file6, delimiter=',')
for rand in reader2:
replaced16 = rand[2].replace('-0-', newstring2)
rand[2] = replaced16
replaced17 = rand[3].replace('-0-', newstring2)
rand[3] = replaced17
replaced18 = rand[4].replace('-0-', newstring2)
rand[4] = replaced18
writer2.writerow(rand)
with open('sdn_comments.csv', 'r') as file7, open('new_sdn_comments.csv', 'w', newline='') as file8:
reader3 = csv.reader(file7, delimiter=',')
writer3 = csv.writer(file8, delimiter=',')
for linie in reader3:
replaced19 = linie[1].replace('-0-', newstring3)
linie[1] = replaced19
writer3.writerow(linie)
我已将清理代码分成 4 个,在所有 4 个中,我在不同的列等上都有此错误。
【问题讨论】:
-
抱歉我的第一条评论。我完全监督了主要问题:
row在您的情况下是您的行内容的元素。row是在reader中读取的行,并且不能有像row[7]甚至row[0]这样的项目(哦,好吧,你会得到我假设的字符串的单个字符)。您可以将文件的内容存储在列表中,然后替换您的内容。 -
@offeltoffel 也许您应该在发布之前阅读 csv 模块的文档?这里的行是列表,而不是字符串。
-
对不起,我的错。我将它与读取功能混淆了。不过,错误意味着
rows没有索引为 7 的元素。也许是输入数据的问题,我们无法在没有看到它的情况下评估... -
第一点:您应该按照文档说明以二进制模式(“rb”和“wb”)打开文件。第二点:如果问题仍然存在,则意味着您的某些文件缺少列,因此您必须处理它 - 通过将文件拒绝为无效或不处理缺少的列(或将它们添加为空/默认值)。您可以在处理之前检查一行中的元素数量,或者您可以使用 try/excepts 块。我要做的第一件事是用 try/except 包装替换代码(for 循环中的部分)并在 except 中打印出行(和 linenum)
-
另外——部分不相关,但无论如何:你的代码中有很多无用的重复。您可以使用
replace(row, index, target, newval)函数将所有替换部分分解出来,并且每个源文件都有一个 index=>replacement 映射,因此您可以使用内部循环进行替换。