我有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数据库的单独表中。所以可能元组不是要走的路。它们只有相同的结构,因此只有表名不同。
答案 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