Python 1 for 2列表循环(csv)

2024-05-13 16:54:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个.csv文件,都包含3001行,我必须对它们做同样的事情,所以我想知道我是否可以把它放入1 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)

有没有可能把它很好地放在一个for循环中,或者我应该为一个文件(d1)做一个for循环,然后手动从第二个csv文件分配一行到d2?你知道吗

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


Tags: 文件csvtoinselfforopen事情
3条回答

结合使用enumerate和zip:

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

编辑:如果你想把每个文件的数据放到一个不同的表中,让一个for循环先遍历一个文件的所有行,然后遍历另一个文件的所有行是行不通的。同样,zip解决方案在这里也不太好,因为它是简单的巧合(?)两个文件的长度相同。我将for循环放入一个以文件句柄和表名为参数的函数中,并首先为第一个和第二个文件调用这个函数。你知道吗

你也可以试试这个:

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

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

chain(*iterables) > chain object

Return a chain object whose .next() method returns elements from the first iterable until it is exhausted, then elements from the next iterable, until all of the iterables are exhausted.

所以在你的情况下:

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和相关的表结构发生变化,就会中断。你知道吗

相关问题 更多 >