Python 1'for'循环为2个列表(csv)

时间:2015-12-16 13:18:19

标签: python csv

我有2个.csv文件,它们都包含3001行,我必须对它们做同样的事情,所以我想知道我是否可以将它放入1 for for循环。

所以我觉得很聪明,试过这个:

self.csv_readingon = csv.reader(open('heisig6_reading_ja_on.csv'))
self.csv_readingkun = csv.reader(open('heisig6_reading_ja_kun.csv'))

for [d1, d2] in [self.csv_readingon, self.csv_readingon]:
    for i, d in enumerate([d1, d2]):
        # Do same stuff to both files

然而,这导致:

for [d1, d2] in [self.csv_readingon, self.csv_readingon]:
ValueError: too many values to unpack (expected 2)

是否可以将它很好地放在1 for循环中,或者我应该为1个文件(d1)制作1循环,然后手动将第2个csv文件中的行分配给d2?

编辑:.csv文件彼此无关。两者都将放在SQLite数据库的单独表中。所以可能元组不是要走的路。它们只有相同的结构,因此只有表名不同。

3 个答案:

答案 0 :(得分:3)

使用枚举和zip的组合:

for i, (d1, d2) in enumerate(zip(self.csv_readingon, self.csv_readingkun)):
    # pass

编辑:如果你想把每个文件的数据放到另一个表中,那么一个for循环首先在一个文件的所有行上迭代,然后在另一个文件的所有行上迭代,将无法工作。此外,zip解决方案在这里也不会很好,因为两个文件具有相同的长度是简单的巧合(?)。我将for循环放入一个函数中,将文件句柄和表名作为参数,并首先为第一个和第二个文件调用此函数。

答案 1 :(得分:0)

csv.reader是可迭代的。链接两个迭代的最简单方法是使用itertools.chain()

  

chain(* iterables) - >链对象

     

返回一个链式对象,其<。> next ()方法返回来自的元素    第一次迭代,直到它耗尽,然后从下一个元素    迭代,直到所有的迭代都用完为止。

所以在你的情况下:

from itertools import chain

for row in chain(reader1, reader2):
   proceed_with(row)*

现在给出您添加的解释(将行插入具有相似结构但名称不同的两个不同的表),这将不起作用。您可以通过将表名与读者一起传递来尝试变得聪明和“通用”,即:

for tablename, reader in (("table1", reader1), ("table2", reader2)):
    for row in reader:
        proceed_with(row, tablename)

但是只要一个或另一个csv和相关的表结构发生变化,这就会中断。

答案 2 :(得分:0)

你也可以试试这个:

for list in [self.csv_readingon, self.csv_readingon]:
    for i, d in enumerate(list):
        # Do same stuff to both files