筛选、转换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--带覆盖率--包含覆盖率--覆盖擦除--覆盖率测试

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么我的代码永远运行?它只是一堆带int的for循环,应该是递减的?   java如何更改IntelliJ IDEA中的XML缩进?   java如何使未填充的int数组不打印0?   eclipse My Weka Java代码结果*Weka*虚拟*STRING*用于*STRING*属性*   java泄漏了Windows com。安卓内部的政策恳求   java这个无限循环的原因是什么?   swing My标签在Java中很模糊   java如何在组件表示存储扩展中获取组件对象   java如何避免selenium网格中的会话超时   Java乘法测验,如果答案错误,如何循环   在Java HttpServlet Google app engine中保存对象   java ArrayList过滤器   java跳跃减慢了xvelocity:使用Libgdx/Box2D进行跳跃和跑步   java删除、复制和修改pom。xml文件   当提供的时区与服务器的时区相同时,RestCall中的java@DateTimeFormat(iso=iso.DATE_TIME)不工作   java Spring批处理多线程默认限制为10隐式?   安卓错误java。lang.UnsupportedOperationException:无法转换为维度:type=0x1