首页 > 解决方案 > 使用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 行

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

标签: pythoncsv

解决方案


问题在于这一行:

writer.writerow(row[row_index])

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

您可以做的是使用列表推导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告诉您到底出了什么问题。下次请尝试仔细阅读和解释错误消息。


推荐阅读