如何使用CSV模块中的Python迭代器

时间:2015-07-10 21:24:35

标签: python csv iterator

我想要在Python中使用大型(145 MB)CSV文件。我是Python的新手,我试图围绕csv.reader()以迭代器的形式提供的数据。我一直在搜索和搜索,我发现了很多关于迭代器是什么以及它们如何工作的信息,但是关于如何在处理数据时实际使用它们的信息非常少。

我理解next()方法和整个停止迭代的事情,但这似乎是一种非常笨拙的方式来存储和检索数据。如果没有在for循环中遍历迭代器中的每一行并将其附加到列表中(这看起来非常麻烦),我真的不知道如何从迭代器中获取所需的数据,特别是考虑到我的数据按列排序,而不是行。使用csv.reader()函数的目的是什么,有没有更好的方法来读取我的csv文件的内容?

每当我需要一个特定的数据集时,我是否希望迭代并重建迭代器数万次以获得我需要的完整数据列?我想我还没有尝试过,但它看起来并不正确......我一定是在遗漏一些东西。

2 个答案:

答案 0 :(得分:1)

迭代器只是一种迭代列表而不将其保存在内存中的方法。从技术上讲,文件可能比可用内存大,甚至交换 - 这将使迭代成为一个令人头痛的问题。

迭代器只承诺知道如何获取下一个值。这种抽象使它忘记了它用来存储的所有东西,但还没有它将要存储的所有东西。因此,它可以具有与单个列表项一样小的内存占用。迭代一个非常缓解的巨大文件。

也就是说,如果您想要不同的数据集,您可能希望首先在一次迭代中创建数据集,然后使用它们。这可以帮助您过滤掉您不会使用的数据。

您也可以在迭代过程中进行处理。

您始终可以选择将整个文件作为列表保存在内存中,但这通常不是您想要的。

以下是使用迭代器进行处理的一些粗略示例:

rows = []
# ... create an iterator
for row in iterator:
    process(row)
# ... use rows

您还可以使用迭代器来过滤您感兴趣的行:

# define an is_needed(row) predicate for a row
needed_rows = filter(is_needed, iterator)

以下是将值存储在内存中的示例:

# ... create iterator
rows = list(iterator)

# ... use rows - contains all values

答案 1 :(得分:1)

您可以使用itertools按列进行迭代。

from itertools import izip

infile = csv.reader(open('t.txt'))
transposed = izip(*infile)
for c in transposed:
    print c