筛选、转换json对象列表并将其导出到json或csv
losser的Python项目详细描述
[![构建状态](https://travis ci.org/ckan/losser.svg)(https://travis ci.org/ckan/losser)
[![覆盖状态](https://img.shields.io/covertalls/ckan/losser.svg)(https://covertalls.io/r/ckan/losser)
[![最新版本](https://pypip.in/version/losser/badge.svg)(https://pypi.python.org/pypi/losser/)
[![下载](https://pypip.in/download/losser/badge.svg)(https://pypi.python.org/pypi/losser/)
[![支持的python版本](https://pypip.in/py_versions/losser/badge.svg)(https://pypi.python.org/pypi/losser/)
[![开发状态](https://pypip.in/status/losser/badge.svg)(https://pypi.python.org/pypi/losser/)
[![许可证](https://pypip.in/license/losser/badge.svg)(https://pypi.python.org/pypi/losser/)
losser
==
一个用于有损筛选、转换和
将JSON导出到与Excel兼容的CSV的UNIX命令和Python库。
为[ckanapi exporter]创建(https://github.com/ckan/ckanapi exporter)。
losser可以可以作为unix命令运行,也可以用作python库
(请参见下面的[用法](用法)。它接受一个json格式的对象列表
(或python dict列表)作为输入,并生成一个"表"作为输出。
输入对象不必都具有相同的字段或结构,并且可以包含任意嵌套的子列表和子对象。
同一顺序的键,子对象和子列表嵌套的深度不超过一层。
它可以输出为:
*python ordereddicts的列表,每个具有相同顺序的键
*一个json格式的文本字符串,表示对象列表,每个对象具有相同顺序的键
([todo](https:)//github.com/ckan/losser/issues/3))
*一个csv格式的文本字符串,每个csv行一个对象。csv
的行对应于输出对象列表中的对象(如果它们已作为python或json数据返回),列对应于对象的键。
在"columns.json"文件中提供"column query"对象的列表
,该列表指定输出表应具有哪些列,以及如何从输入对象中检索这些列的值
。
commod",
"title":"示例输入对象",
"extras":
{
"交付单元":"调试"
{
},
…
]
"您可以使用类似这样的"columns.json"文件来转换它们:
{
"数据所有者":{
"模式路径":"^author$"
},
"title":{
"pattern"path":"^title$"
},
"delivery unit":{
"pattern"path":"^extras$","^delivery unit$"]
}
}
这将输出这样的csv文件:
data owner,title,delivery unit
sean hammond,inpu示例t object,调试
frank black,另一个示例对象,另一个单元
…
数据所有者
2.标题
3.传递单元
每列的值都是按照
"pattern path"从输入对象中检索的:与输入对象及其子对象的键匹配的正则表达式列表,依次查找值。
例如,上面的"数据所有者"字段具有pattern path"^author$",该路径
匹配字符串"author"。这将在
输入对象中找到名为"author"的顶级键,并在
输出表的"数据所有者"列中输出它们的值。上面的e"交货单位"列有一个更复杂的模式路径:
`["^extras$","^delivery unit$"]`。这将在输入对象中找到顶级键"extras",并假设"extras"键的值是子对象,
将在子对象中找到并返回"delivery unit"键的值。
r/>子对象。
模式路径中的一个模式可以匹配对象或子对象中的多个键。在这种情况下,losser在每个匹配的键上递归并结束
返回值列表而不是单个值。
例如,给定这个输入对象:
{
"update":"yearly",
"update frequency":"monthly",
…
}
tern path`"^update.*"`(与"update"和"update
frequency"匹配)将在csv输出中的相应单元格中输出"yearly,monthly"(带引号、逗号分隔的列表)
。
在其每个项上列出并递归。同样,它将返回
值列表而不是单个值。
r/>"format":"json"、
…
}、
…
、
…
…
、
…
]
pattern path `["^resources$"、"^format$"]`将找到每个对象的
"resources"子列表,然后在ea中找到"format"字段
子列表中的ch对象。csv列中的值将是类似"csv,json"的列表。
列表可以选择性地进行重复数据消除。
这些字段在输出单元格中变平。
可以使用losser进行的一些筛选和转换包括:
*从对象中提取一些字段,并筛选出其他字段。
s.json`文件被过滤掉。
([todo](https://github.com/ckan/losser/issues/2):支持将不匹配的
字段作为附加列追加到输出表的末尾。
*指定输出表中列的顺序。
它们出现在"columns.json"
文件中,该文件不必与输入对象中的相应字段的顺序相同。
*重命名字段,对输出表中的列使用不同的名称,而不是对输入对象中的字段使用不同的名称。
要从每个输入对象中获取"notes"字段并将它们全部放入输出表的"description"列中,请将该对象放入
`columns.json`:
"description":{
"pattern\path":"^notes$",
}
*敏感地匹配模式大小写。
默认情况下,模式是不区分大小写匹配的。要在
`columns.json`文件中的列查询中执行区分大小写
matching put`"区分大小写":true`:
"标题":{
"模式路径":"^title$",
"区分大小写":true
},
这将匹配输入对象中的"标题",但不匹配"标题""le"或"title"。
*转换匹配的值,例如从字符串中截断或去除空白。
*提供任意的前处理器和后处理器函数,以对输入和输出对象进行自定义的
([to do](https://github.com/cka)n/losser/issues/1)。
*使用与任何
名称匹配的模式查找名称不一致的字段,并将它们组合成一列在输出表中。
例如,您可以提供一个类似"^update.*"的模式,该模式将在不同的输入对象中找到名为"update"、"update"、"update frequency"的键
,并在单个"update frequency"列中收集它们的值。
*将多个字段收集到一起一列中的醚。
2":"nigel godrich",
"contributor 3":"jonny greenwood",
…
}
模式"^contributor.*"将匹配所有三个字段,
csv单元格中的值将为""thom yorke,nigel godrich,jonny greenwood"。
*可以指定模式path应该在对象中找到一个唯一的值,
,如果对象中有多个值与模式匹配(将返回一个列表
),则会引发异常。
在"columns.json"文件中的列查询中使用"unique":true:
"title":{
模式路径"^title$",
"unique":true
},
通过对象
([todo](https://github.com/ckan/losser/issues/4))。
*当模式匹配通过输入对象的多条路径,或匹配通过子列表的
路径时,可以对输出
表单元格中的值的结果列表进行重复数据消除。在"columns.json"文件中的列查询中输入"deduplicate":true;
"format":{
"pattern\u path":["^resources$","^format$"],
"deduplicate":true
},
ems(与它们的键相反)。
键,然后在每个
匹配键的值上递归。
你不能给它一个匹配值的模式来决定是否返回它。
s将导致一个嵌套列表被返回,它将
展平为一个列表并可选地进行重复数据消除。)同样,您不能
为每个项提供要匹配的模式,以决定是否
返回/递归。
ys会增加很多
功能。
要求
----
installation
----
要安装运行:
要安装以进行开发,请创建并激活python虚拟环境
,然后:
git克隆https://github.com/ckan/losser.git
cd losser
python setup.py develop
pip install-r dev requirements.txt
usage
----
它可以与其他unix命令组合。例如:
losser--columns columns.json<;input.json>;output.csv
y您还可以在命令行上指定列,而不是使用
columns.json文件。例如:
losser--列"数据所有者"--模式"^author$"--唯一--区分大小写--列"说明"--模式"^notes$"--唯一--区分大小写--最大长度255--列格式--模式"^resources$"^格式$"--区分大小写--重复数据消除
以列标题为参数
、后跟"-pattern"选项的更多"-column"选项以及任何其他列选项(`--unique`、
`--case sensitive`,等等)。
包含多个模式,例如:`--pattern"^resources$"^format$"`.
列选项,如`--pattern`、`--unique`、`--max length`等,适用于命令行上`--column'前面的`--rom"input.json",从
"columns.json"读取列查询,并将输出对象写入"output.csv"。
` columns`可以是
dict的列表,也可以是"columns.json"文件(字符串)的路径。返回的"table"将是一个dict列表。如果将'csv=true'传递给'table()',它将返回一个
csv格式的字符串。有关更多参数,请参见"table()"的docstring。
您可能希望在自己的基于losser的命令中提供相同的命令行功能,而无需重新实现它们。
例如[ckanapi exporter](https://github.com/ckan/ckanapi-exporter)提供了
losser命令行界面,但添加了自己的"--url"和"--apikey"
arguments直接从ckan站点提取输入数据,而不是从stdin读取输入数据。
`losser.cli`提供了'make_parser()`和'parse()'函数来启用继承其命令行界面的
。下面是如何使用它们的:
parent_parser=losser.cli.make_parser(add_help=false,exclude_args=["-i"])
parser=argparse.argumentparser(
description="将数据集从CKAN站点导出到JSON或CSV。",
parent s=[parent_parser],
)
parser.add_argument(--url,必需=true)
parser.add_argument(--apikey)
尝试:
parsed_args=losser.cli.parse(parser=parser)
除了losser.cli.commandlineexit as err:
sys.exit(err.code)
除了losser.cli.commandlineerror as err:
如果是err.message:
parser.error(err.message)
url=parsed_args.url
columns=parsed_args.columns
apikey=parsed_args.apikey
datasets=get_datasets_from_ckan(url,apikey)
csv_string=losser.losser.table(datasets,columns,csv=true)
波特](https://github.com/ckan/ckanapi-exporter)获取一个
工作示例。
notests
要运行测试并生成测试覆盖率报告,请执行以下操作:
notests--带覆盖率--包含覆盖率--覆盖擦除--覆盖率测试
[![覆盖状态](https://img.shields.io/covertalls/ckan/losser.svg)(https://covertalls.io/r/ckan/losser)
[![最新版本](https://pypip.in/version/losser/badge.svg)(https://pypi.python.org/pypi/losser/)
[![下载](https://pypip.in/download/losser/badge.svg)(https://pypi.python.org/pypi/losser/)
[![支持的python版本](https://pypip.in/py_versions/losser/badge.svg)(https://pypi.python.org/pypi/losser/)
[![开发状态](https://pypip.in/status/losser/badge.svg)(https://pypi.python.org/pypi/losser/)
[![许可证](https://pypip.in/license/losser/badge.svg)(https://pypi.python.org/pypi/losser/)
losser
==
一个用于有损筛选、转换和
将JSON导出到与Excel兼容的CSV的UNIX命令和Python库。
为[ckanapi exporter]创建(https://github.com/ckan/ckanapi exporter)。
losser可以可以作为unix命令运行,也可以用作python库
(请参见下面的[用法](用法)。它接受一个json格式的对象列表
(或python dict列表)作为输入,并生成一个"表"作为输出。
输入对象不必都具有相同的字段或结构,并且可以包含任意嵌套的子列表和子对象。
同一顺序的键,子对象和子列表嵌套的深度不超过一层。
它可以输出为:
*python ordereddicts的列表,每个具有相同顺序的键
*一个json格式的文本字符串,表示对象列表,每个对象具有相同顺序的键
([todo](https:)//github.com/ckan/losser/issues/3))
*一个csv格式的文本字符串,每个csv行一个对象。csv
的行对应于输出对象列表中的对象(如果它们已作为python或json数据返回),列对应于对象的键。
在"columns.json"文件中提供"column query"对象的列表
,该列表指定输出表应具有哪些列,以及如何从输入对象中检索这些列的值
。
commod",
"title":"示例输入对象",
"extras":
{
"交付单元":"调试"
{
},
…
]
"您可以使用类似这样的"columns.json"文件来转换它们:
{
"数据所有者":{
"模式路径":"^author$"
},
"title":{
"pattern"path":"^title$"
},
"delivery unit":{
"pattern"path":"^extras$","^delivery unit$"]
}
}
这将输出这样的csv文件:
data owner,title,delivery unit
sean hammond,inpu示例t object,调试
frank black,另一个示例对象,另一个单元
…
数据所有者
2.标题
3.传递单元
每列的值都是按照
"pattern path"从输入对象中检索的:与输入对象及其子对象的键匹配的正则表达式列表,依次查找值。
例如,上面的"数据所有者"字段具有pattern path"^author$",该路径
匹配字符串"author"。这将在
输入对象中找到名为"author"的顶级键,并在
输出表的"数据所有者"列中输出它们的值。上面的e"交货单位"列有一个更复杂的模式路径:
`["^extras$","^delivery unit$"]`。这将在输入对象中找到顶级键"extras",并假设"extras"键的值是子对象,
将在子对象中找到并返回"delivery unit"键的值。
r/>子对象。
模式路径中的一个模式可以匹配对象或子对象中的多个键。在这种情况下,losser在每个匹配的键上递归并结束
返回值列表而不是单个值。
例如,给定这个输入对象:
{
"update":"yearly",
"update frequency":"monthly",
…
}
tern path`"^update.*"`(与"update"和"update
frequency"匹配)将在csv输出中的相应单元格中输出"yearly,monthly"(带引号、逗号分隔的列表)
。
在其每个项上列出并递归。同样,它将返回
值列表而不是单个值。
r/>"format":"json"、
…
}、
…
、
…
…
、
…
]
pattern path `["^resources$"、"^format$"]`将找到每个对象的
"resources"子列表,然后在ea中找到"format"字段
子列表中的ch对象。csv列中的值将是类似"csv,json"的列表。
列表可以选择性地进行重复数据消除。
这些字段在输出单元格中变平。
可以使用losser进行的一些筛选和转换包括:
*从对象中提取一些字段,并筛选出其他字段。
s.json`文件被过滤掉。
([todo](https://github.com/ckan/losser/issues/2):支持将不匹配的
字段作为附加列追加到输出表的末尾。
*指定输出表中列的顺序。
它们出现在"columns.json"
文件中,该文件不必与输入对象中的相应字段的顺序相同。
*重命名字段,对输出表中的列使用不同的名称,而不是对输入对象中的字段使用不同的名称。
要从每个输入对象中获取"notes"字段并将它们全部放入输出表的"description"列中,请将该对象放入
`columns.json`:
"description":{
"pattern\path":"^notes$",
}
*敏感地匹配模式大小写。
默认情况下,模式是不区分大小写匹配的。要在
`columns.json`文件中的列查询中执行区分大小写
matching put`"区分大小写":true`:
"标题":{
"模式路径":"^title$",
"区分大小写":true
},
这将匹配输入对象中的"标题",但不匹配"标题""le"或"title"。
*转换匹配的值,例如从字符串中截断或去除空白。
*提供任意的前处理器和后处理器函数,以对输入和输出对象进行自定义的
([to do](https://github.com/cka)n/losser/issues/1)。
*使用与任何
名称匹配的模式查找名称不一致的字段,并将它们组合成一列在输出表中。
例如,您可以提供一个类似"^update.*"的模式,该模式将在不同的输入对象中找到名为"update"、"update"、"update frequency"的键
,并在单个"update frequency"列中收集它们的值。
*将多个字段收集到一起一列中的醚。
2":"nigel godrich",
"contributor 3":"jonny greenwood",
…
}
模式"^contributor.*"将匹配所有三个字段,
csv单元格中的值将为""thom yorke,nigel godrich,jonny greenwood"。
*可以指定模式path应该在对象中找到一个唯一的值,
,如果对象中有多个值与模式匹配(将返回一个列表
),则会引发异常。
在"columns.json"文件中的列查询中使用"unique":true:
"title":{
模式路径"^title$",
"unique":true
},
通过对象
([todo](https://github.com/ckan/losser/issues/4))。
*当模式匹配通过输入对象的多条路径,或匹配通过子列表的
路径时,可以对输出
表单元格中的值的结果列表进行重复数据消除。在"columns.json"文件中的列查询中输入"deduplicate":true;
"format":{
"pattern\u path":["^resources$","^format$"],
"deduplicate":true
},
ems(与它们的键相反)。
键,然后在每个
匹配键的值上递归。
你不能给它一个匹配值的模式来决定是否返回它。
s将导致一个嵌套列表被返回,它将
展平为一个列表并可选地进行重复数据消除。)同样,您不能
为每个项提供要匹配的模式,以决定是否
返回/递归。
ys会增加很多
功能。
要求
----
installation
----
要安装运行:
要安装以进行开发,请创建并激活python虚拟环境
,然后:
git克隆https://github.com/ckan/losser.git
cd losser
python setup.py develop
pip install-r dev requirements.txt
usage
----
它可以与其他unix命令组合。例如:
losser--columns columns.json<;input.json>;output.csv
y您还可以在命令行上指定列,而不是使用
columns.json文件。例如:
losser--列"数据所有者"--模式"^author$"--唯一--区分大小写--列"说明"--模式"^notes$"--唯一--区分大小写--最大长度255--列格式--模式"^resources$"^格式$"--区分大小写--重复数据消除
以列标题为参数
、后跟"-pattern"选项的更多"-column"选项以及任何其他列选项(`--unique`、
`--case sensitive`,等等)。
包含多个模式,例如:`--pattern"^resources$"^format$"`.
列选项,如`--pattern`、`--unique`、`--max length`等,适用于命令行上`--column'前面的`--rom"input.json",从
"columns.json"读取列查询,并将输出对象写入"output.csv"。
` columns`可以是
dict的列表,也可以是"columns.json"文件(字符串)的路径。返回的"table"将是一个dict列表。如果将'csv=true'传递给'table()',它将返回一个
csv格式的字符串。有关更多参数,请参见"table()"的docstring。
您可能希望在自己的基于losser的命令中提供相同的命令行功能,而无需重新实现它们。
例如[ckanapi exporter](https://github.com/ckan/ckanapi-exporter)提供了
losser命令行界面,但添加了自己的"--url"和"--apikey"
arguments直接从ckan站点提取输入数据,而不是从stdin读取输入数据。
`losser.cli`提供了'make_parser()`和'parse()'函数来启用继承其命令行界面的
。下面是如何使用它们的:
parent_parser=losser.cli.make_parser(add_help=false,exclude_args=["-i"])
parser=argparse.argumentparser(
description="将数据集从CKAN站点导出到JSON或CSV。",
parent s=[parent_parser],
)
parser.add_argument(--url,必需=true)
parser.add_argument(--apikey)
尝试:
parsed_args=losser.cli.parse(parser=parser)
除了losser.cli.commandlineexit as err:
sys.exit(err.code)
除了losser.cli.commandlineerror as err:
如果是err.message:
parser.error(err.message)
url=parsed_args.url
columns=parsed_args.columns
apikey=parsed_args.apikey
datasets=get_datasets_from_ckan(url,apikey)
csv_string=losser.losser.table(datasets,columns,csv=true)
波特](https://github.com/ckan/ckanapi-exporter)获取一个
工作示例。
notests
要运行测试并生成测试覆盖率报告,请执行以下操作:
notests--带覆盖率--包含覆盖率--覆盖擦除--覆盖率测试