python - 如何从 CSV 模块使用 Python 迭代器

标签 python csv iterator

我有一个大型 (145 MB) CSV 文件,我想在 Python 中使用它。我是 Python 的新手,我正在努力思考 csv.reader() 以迭代器形式提供的数据。我一直在搜索和搜索,发现了大量关于迭代器是什么以及它们如何工作的信息,但关于如何在处理数据时实际使用它们的信息却很少。

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

每次我需要一个特定的数据集时,我是否需要迭代并重建迭代器数万次以获得我需要的完整数据列?我想我还没有尝试过,但这似乎不对……我一定是遗漏了什么。

最佳答案

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

迭代器只 promise 它知道如何获取下一个值。这种抽象允许它忘记它曾经存储的所有内容,并且还没有它要存储的所有内容。所以它的内存占用可以和单个列表项一样小。迭代非常轻松的巨大文件时。

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

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

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

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

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

关于python - 如何从 CSV 模块使用 Python 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31350509/

相关文章:

python - pyspark : select columns with special characters from map type column

Python:如何将列表/数组/pd.Series中的零值设置为下一个非零值?

python - CSV 到 JSON Python,将组类别附加到字典

json - JSON 哪个选项更好?或 CSV? (对于从远程服务器到 Web 应用程序(前端)的大数据 (~1 GB)

loops - 迭代 Lua Torch 中的目录

c++ - 我做错了什么导致无限循环

javascript - 处理隐藏元素

Python 可以像 Haskell 一样制作字母表吗?

python - 将 TSV 文件中的列加载到 python 列表中

java - 从 ArrayList 中获取匹配的子集