使用 python 的 toolz 包解析 CSV

Parsing a CSV using python's toolz package

我最近发现了 toolz 存储库并决定试一试。

不幸的是,我在正确使用它或至少理解它时遇到了一些麻烦。

我自己的第一个简单任务是解析制表符分隔的 TSV 文件并获取其中的第二列条目。

例如,给定文件 foo.tsv:

a    b    c
d    e    f

我想要 return 一份 ['b', 'e'] 的列表。我通过以下逻辑成功实现了这一点

from toolz.curried import *

with open("foo.tsv", 'r') as f:
    data = pipe(f, map(str.rstrip),
                           map(str.split),
                           map(get(1)),
                           tuple)
    print(data)

但是,如果我将 foo.tsv 文件更改为使用逗号而不是制表符作为列分隔符,我似乎无法找到调整上述代码来处理该问题的最佳方法。我不清楚如何将 "," 参数添加到 str.split 函数,同时将 mappipethread_first 函数一起使用。

是否已有一些现有文档对此进行了描述?

lambdas

不要害怕使用 lambda。

map(lambda s: s.split(','))

它可能不如 map(str.split) 漂亮,但它明白了要点

使用 pluck

考虑使用 pluck(...) 而不是 map(get(...))

map(get(1)) -> pluck(1)

使用Pandas

如果您有 CSV 文件,您可以考虑只使用 Pandas,它速度非常快,并且针对此类工作进行了高度优化。

根据 MRocklin 的上述回答,我使用 toolz 的 CSV 解析代码应该更像:

with open("foo.tsv", 'r') as f:
    data = pipe(f, map(lambda (s): str.rstrip(s, "\n")),
                   map(lambda (s): str.split(s, "\t")),
                   pluck(1),
                   tuple)
    print(data)

您的 tsv 文件版本可以缩短为:

pipe(f, map(str.split), pluck(1), tuple)

要读取逗号分隔的文件,请使用如下内容:

pipe(f, map(lambda s: s.split(',')), pluck(1), map(str.strip), tuple)