我知道之前已经问过这个问题,但我认为这个上下文有点不同,因为我遇到了一个不同的问题,我得到一个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
谢谢!
答案 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)
我知道您正在使用特定模块,但pandas
对csv 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)