在python中,如何只将列表中的某些值写入CSV文件?

时间:2013-12-07 07:49:27

标签: python list csv tuples

我知道之前已经问过这个问题,但我认为这个上下文有点不同,因为我遇到了一个不同的问题,我得到一个TypeError,列表索引必须是整数,而不是元组。

我现在的代码:

writer = csv.writer(open("test-new.csv", "wb"))
with open("test.csv", "r") as f:
    reader = csv.reader(f)
    for v in reader:
        # does things
        writer.writerow(v[0, 3])

我认为这个问题正在发生,因为脚本认为我正在尝试将一个元组写入一个新的csv文件(test-new),而实际上我只是想从4个值的列表中编写这两个值到一个新的csv。

关于如何告诉python的任何想法我不是要写一个元组?是否可以使用dictwriter代替,可能?

如果我的初始csv如下:

a, b, c, d
1, 2, 3, 4
5, 6, 7, 8

我希望我的最终输出看起来像:

a, d
1, 4
5, 8

谢谢!

4 个答案:

答案 0 :(得分:2)

writer.writerow(v[0, 3])更改为writer.writerow(tuple(v[::3]))writer.writerow((v[0], v[3]))

[::#]被称为extended slice符号,并且表示每个#个插槽都会抓取元素,因此在这种情况下:0,3。注意:如果您的列表超过四个,则第一种方法将提供:(v[0],v[3],v[6],...)

您的v[0,3]不是有效的Python表示法。解释器认为你正在尝试传递一个元组来索引列表,这是无法完成的。因此错误。

答案 1 :(得分:1)

v[0,3]替换为(v[0], v[3])。您正在尝试创建一个非连续的切片,但没有真正使用切片语法。除非您没有指定严格的模式,否则这将是将列表的任意元素转换为元组的一般方法,以便在需要序列的地方使用。

答案 2 :(得分:0)

我知道您正在使用特定模块,但pandascsv tables非常棒。看看这个:

>>> df = pd.read_csv('test.csv',sep=r'\s+')
>>> df
   a,  b,  c,  d
0  1,  2,  3,  4
1  5,  6,  7,  8
>>> col_list = [0,2]
>>> df = df[col_list] #you just pick which columns you want to keep.
>>> df                #voila
   a,  c,
0  1,  3,
1  5,  7,

如果你有实验感,你应该尝试一下。 (假装我选择了你需要的列)

答案 3 :(得分:0)

此处的问题是您用于从列表中获取两个项目的语法不正确。例如:

>>> v = [1, 2, 3, 4]
>>> v[0, 3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not tuple

您可以通过多种方式获取这些值。下面显示了一些方法。

对于您的具体情况,您可以抓住所需的两个项目:

(v[0], v[3])

您可以使用列表理解:

[v[i] for i in [0, 3]]

您还可以使用operator中的itemgetter

import operator
operator.itemgetter(0, 3)(v)