使用python

时间:2019-04-04 13:25:59

标签: python csv

我有一个变量,该变量具有要从一个CSV文件中获取的行索引号,并将这些行写入新的行中。

我尝试从中复制的

CSV文件如下:

sdkgsk; 74785797; hdfgsdgfjss

asdjkhfgsdkjg; 9857349834; jsdhfg

skhgf; 76578346534; jhfgsdjhgdf

sdifl; 56975654;​​ kjdjh

afhkddf; 439587349346; hsfd

kdgfdkj; 983496; hioas

oish; 89468468; jhfdsgsdf

jksdfjhksdfjk; 8968; jkfdsjhksd

我尝试了很多事情,但这是最后一个:

row_index = [2,4,6]

with open('test.csv', 'r') as f,open('out.csv', 'w') as f_out:
    reader = csv.reader(f)
    writer = csv.writer(f_out)
    lines = list(reader)
    for row in lines:
        writer.writerow(row[row_index])

我希望生成一个名为“ out.csv”的新文件,其中包含来自“ test.csv”的第2、4和6行。

相反,我收到此错误消息:“列表索引必须是整数或切片,而不是列表”

1 个答案:

答案 0 :(得分:3)

问题出在这一行:

writer.writerow(row[row_index])

row_index是一个列表,您不能用另一个列表索引一个整数列表(row)。这正是python解释器试图通过此错误消息告诉您的内容: list indices must be integers or slices, not list

您可以使用list comprehension基于new_row列表创建row_index

for row in lines:
    new_row = [row[index] for index in row_index]
    writer.writerow(new_row)

编辑: 我遗漏了另一个问题,基于您的代码,我认为您想重写每一行的第2,4和6列,但您真正想要索引的是行而不是列。因此,您想重写第2,4和6行。在这种情况下,您可以再次使用列表推导。

with open('test.csv', 'r') as f,open('out.csv', 'w') as f_out:
    reader = csv.reader(f)
    writer = csv.writer(f_out)
    lines = list(reader)
    new_rows = [lines[index] for index in row_index]
    writer.writerows(new_rows)

同样,list index out of range错误消息会告诉您确切的错误。下次请尝试仔细阅读和解释错误消息。