【问题标题】:Python IndexError: list index out of range in cleaning up a file using CSV modulePython IndexError:使用 CSV 模块清理文件时列表索引超出范围
【发布时间】: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 映射,因此您可以使用内部循环进行替换。

标签: python django csv


【解决方案1】:

我发现了我的问题。在我的最后一行,我有一个来自数据库导出的代码。该代码如下所示:['\x1a']因此我从下面编写代码以删除最后一行。

readFile1 = open("sdn.csv")
lines1 = readFile1.readlines()
readFile1.close()
w1 = open("sdn.csv", 'w')
w1.writelines([item for item in lines1[:-1]])
w1.close()

readFile2 = open("add.csv")
lines2 = readFile2.readlines()
readFile2.close()
w2 = open("add.csv",'w')
w2.writelines([item for item in lines2[:-1]])
w2.close()

readFile3 = open("alt.csv")
lines3 = readFile3.readlines()
readFile3.close()
w = open("alt.csv",'w')
w.writelines([item for item in lines3[:-1]])
w.close()

【讨论】:

    猜你喜欢
    • 2018-05-15
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2016-08-25
    • 2017-04-05
    • 2012-07-15
    相关资源
    最近更新 更多