【问题标题】:Python 1 'for' loop for 2 lists (csv) [duplicate]2个列表(csv)的Python 1“for”循环[重复]
【发布时间】:2015-12-16 13:18:18
【问题描述】:

我有 2 个 .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)

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

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

【问题讨论】:

  • zip ....
  • 你也需要索引吗?
  • @KarolyHorvath 我不认为zip 会满足OP 的要求...zip([1, 2, 3], [4, 5, 6]) => [(1, 4), (2, 5), (3, 6)]
  • @OP 你打算对这些东西做什么?您是否需要将每个 csv 文件中的项目相互比较,还是只想处理第一个 csv 文件,然后处理第二个 csv 文件。请更新您的问题,使其更具体。
  • @OP:如果您想将每个文件的数据放入不同的表中,那么让一个 for 循环首先遍历一个文件中的所有行,然后遍历文件中的所有行是行不通的。其他文件。 zip 解决方案在这里也不是很好,因为两个文件具有相同的长度只是巧合(?)。我将 for 循环放入一个以文件句柄和表名作为参数的函数中,并首先为第一个和第二个文件调用此函数。

标签: python csv


【解决方案1】:

使用 enumerate 和 zip 的组合:

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

编辑:如果您想将每个文件的数据放入不同的表中,那么让一个 for 循环首先遍历一个文件的所有行,然后遍历另一个文件的所有行是行不通的。此外,这里的 zip 解决方案也不是很好,因为两个文件具有相同的长度只是巧合(?)。我将 for 循环放入一个以文件句柄和表名作为参数的函数中,并首先为第一个和第二个文件调用此函数。

【讨论】:

  • 打败我!我会删除我的答案:)
  • 要么我错过了重点,要么使用 enumerate 的 OP 示例愚弄了某人,但我读到的是:“我想对 2 个 csv 文件中的行应用相同的处理,而无需编写两个for 循环...在这种情况下,您的解决方案可能是做一件非常简单的事情的最复杂方法之一;-)
  • 我对 OP 的理解是,他想同时处理两个文件的每两行,并且他也需要行号。这就是为什么我乍一看不同意您的解决方案,但考虑到它也有可能处理第一个文件和之后的第二个文件就足够了 OP ... :)
  • @brunodesthuilliers 在我对 PS 问题的解释中,我同意 elzellpzp 但我承认这个问题不是一个好问题。 .
  • @brunodesthuilliers 现在问题更具体了,所以我的解决方案不太合适。但简单地链接输入也不起作用(请参阅我对上面原始帖子的评论)。
【解决方案2】:

你也可以试试这个:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 2018-10-10
      • 1970-01-01
      • 2015-08-26
      • 2020-03-17
      • 2018-12-01
      • 1970-01-01
      相关资源
      最近更新 更多