使用 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
函数,同时将 map
与 pipe
或 thread_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)
我最近发现了 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
函数,同时将 map
与 pipe
或 thread_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)