orsyste是一个使用人类高效语法在txt文件中存储和读取简单结构化数据的工具。
orpyste的Python项目详细描述
关于此软件包
orpyte是一个pystore的anagram,它的构建使处理文本数据变得容易,并存储在文本文件中。
如果你想要更多的信息和例子,只需要 查看文档字符串。
请原谅我的英语…
英语不是我的母语,所以如果你注意到我的文档和代码中存在误解、拼写错误或语法错误,请友好对待。
这个版本的新功能是什么?
此版本仅更新–pypi的设置。
这个版本的新功能是什么?
无法再缩进节和注释(对于节,此功能确实是个错误)。
这个版本的新功能是什么?
一个有用的新功能:您现在可以使用分区在单个物理文件中聚合不同的虚拟文件。
上一版本的新功能是什么?
此版本中有一些重要的更改。
对于同一块中的可重复键,已完全实现模式
multikeyVal
。您现在可以使用上下文管理器来处理类
read
、readblock
和clean
。通过将与…作为…:
,您让包调用方法build
和remove_extras
(最后一个方法的名称是remove
before)类的readblock不再具有flatdict和recudict方法。相反,它有两个属性
flatdict
和treedict
允许使用类似于dict的变量。对于自定义词典,可以使用新方法
mydict
类
infos
的旧方法rtu datas
已被属性rtu
替换,该属性的输出更易于"理解",并且还有一个迭代器yrtu
来处理类read
和readblock
< > >您可以使用类似于c的注释对
peuf
文件进行注释,但注释只能从一行的最开始处开始数据以三种不同类型的数据块结构。
块用两个连续的两点表示,其内容缩进。
块可以是类似块
book
的容器。这是用来收集不同区块的。块
general
存储键值数据,可以选择分隔符。这里我们使用了=
但这不是一项义务。您也可以选择允许或不允许多次使用同一个密钥,最后一种块用于逐字记录内容。最后的空行将被删除,除非您像我们所做的那样使用magic注释
///
。在我们的示例中,blockresume
有一个由组成的内容,这本书是对时间流逝的颂歌…
后面跟着两个空行。
< > >
为什么还要用另一种微小的语言来存储文本数据呢?
包oryste
是由于需要快速地将简单的结构化数据写入配置文件和单元测试而诞生的。在进入细节之前,这里有一个小例子,它是一个存储玩家信息的或yste
文件。很抱歉缺乏创意…
joueur_1::
date = 1985
sexe = masculin
score = 18974
alias = Super Mario
joueur_2::
date = 1991
sexe = féminin
score = 32007
alias = Sonic
用XML编写此文件可以这样做:
<joueur_1date="1985"sexe="masculin"score="18974"alias="Super Mario"/><joueur_2date="1991"sexe="féminin"score="32007"alias="Sonic"/>
使用json,我们可以使用以下变量。
{"joueur_1":{"date":"1985","sexe":"masculin","score":"18974","alias":"Super Mario",},"joueur_2":{"date":"1991","sexe":"féminin","score":"32007","alias":"Sonic",}}
如您所见,对于简单的数据,或yste
提供了一种非常简单有效的存储信息的方法。
如何编写或yste
可读的文件?
由或yste
读取的文件的规范被命名为peuf
。所以问题变成:"什么是格式良好的peuf
文件?"
为了回答这个问题,让我们看看下面的示例。
/*
Long comment: here, we use the first block as a container.
Note the use of two consecutive double points so as to indicate a block.
*/
book::
// Short comment: then the block `general` uses a key-value storing.
general::
author = M. Nobody
title = Does this book have a title ?
date = 2012, May the 1st
// Short comment: the last block `resume` uses a verbatim content.
resume::
This book is an ode to the passing time...
////
让我们解释一下前面示例的内容。
逐行读取数据
让我们考虑下面的文件,其中book
是一个容器,general
是一个经典的键值内容,使用分隔符=
和resume
有一个完整的内容。
book::
general::
author = M. Nobody
title = Does this book have a title ?
date = 2012, May the 1st
resume::
This book is an ode to the passing time...
A challenging thinking.
假设user/example.peuf
是存储文件的路径。使用下面的代码演示如何读取我们的数据。
frompathlibimportPathimportpprintfromorpyste.dataimportReadwithRead(content=Path("user/example.peuf"),mode={"container":":default:","keyval:: =":"general","verbatim":"resume"})asdatas:foronedataindatas:ifonedata.isblock():print('--- {0} ---'.format(onedata.querypath))elifonedata.isdata():pprint.pprint(onedata.rtu)
在终端中启动时,脚本将生成以下输出,您可以注意到,像book/general
这样的"querypath"表示块general
在块book
中
--- book/general ---
(4, 'author', '=', 'M. Nobody')
(5, 'title', '=', 'Does this book have a title ?')
(6, 'date', '=', '2012, May the 1st')
--- book/resume ---
(9, 'This book is an ode to the passing time...')
(10, 'A challenging thinking.')
您可以看到逐行给出逐字内容,并且始终指示一个键与其值之间的分隔符。最后一个行为是因为如果需要,可以使用不同的分隔符。 原始内容中的行数总是给定的,以便其他应用程序可以将它们用于消息。
下面是另一个数据文件示例。
logic::
A <==> B
A ==> B
A <== P
使用上面的代码很容易读取此文件,其中mode="multikeyval::<;==>;<;====>;""
是mode={"multikeyval::<;===>;<;====>;":"默认值:"}
。此设置允许多次使用同一个键。
frompathlibimportPathimportpprintfromorpyste.dataimportReadwithRead(content=Path("user/example.peuf"),mode="multikeyval:: <==> <== ==>")asdatas:foronedataindatas:ifonedata.isblock():print('--- {0} ---'.format(onedata.querypath))elifonedata.isdata():pprint.pprint(onedata.rtu)
下面的输出显示了始终使用分隔符的必要性。
joueur_1::
date = 1985
sexe = masculin
score = 18974
alias = Super Mario
joueur_2::
date = 1991
sexe = féminin
score = 32007
alias = Sonic
0
逐块读取数据
我们回到第二个例子,它的路径是user/example.peuf
joueur_1::
date = 1985
sexe = masculin
score = 18974
alias = Super Mario
joueur_2::
date = 1991
sexe = féminin
score = 32007
alias = Sonic
1
类readblock
是read
的子类,因此您可以使用任何与read
一起工作的方法。但是,readblock的目标是使用字典,而不是逐行读取数据(对于大型文件,这是最后一个更好的选择)。让我们先看看属性flatdict
joueur_1::
date = 1985
sexe = masculin
score = 18974
alias = Super Mario
joueur_2::
date = 1991
sexe = féminin
score = 32007
alias = Sonic
2
在一个终端中启动的代码为我们提供以下输出(已手动格式化)
joueur_1::
date = 1985
sexe = masculin
score = 18974
alias = Super Mario
joueur_2::
date = 1991
sexe = féminin
score = 32007
alias = Sonic
3
如您所见,键是"querypaths",值是数据。您还可以使用属性treedict
生成一个字典,其结构类似于所分析内容中的一个块。下面的代码与前面的代码完全相同([…]
表示前面代码的第一行)
joueur_1::
date = 1985
sexe = masculin
score = 18974
alias = Super Mario
joueur_2::
date = 1991
sexe = féminin
score = 32007
alias = Sonic
4
以下是生成的词典(输出已手动格式化)
joueur_1::
date = 1985
sexe = masculin
score = 18974
alias = Super Mario
joueur_2::
date = 1991
sexe = féminin
score = 32007
alias = Sonic
5
如果您想通过readblock
自定义一点字典,可以使用方法mydict
如下面的示例(有关更多信息,请参见"docstrings")
joueur_1::
date = 1985
sexe = masculin
score = 18974
alias = Super Mario
joueur_2::
date = 1991
sexe = féminin
score = 32007
alias = Sonic
6
我们在这里获得两个既没有分隔符,也没有数字行的标准词典。
joueur_1::
date = 1985
sexe = masculin
score = 18974
alias = Super Mario
joueur_2::
date = 1991
sexe = féminin
score = 32007
alias = Sonic
7
搜索块
这里我们考虑以下文件,其路径保持为user/example.peuf
joueur_1::
date = 1985
sexe = masculin
score = 18974
alias = Super Mario
joueur_2::
date = 1991
sexe = féminin
score = 32007
alias = Sonic
8
类read
和readblock
允许使用"querypaths"上的查询搜索数据块。要使用的特殊语法试图抓住python regex和unix glob语法的最佳之处。有关详细信息,请参阅函数data.regexify
的文档。以下示例给出了一些查询示例。
joueur_1::
date = 1985
sexe = masculin
score = 18974
alias = Super Mario
joueur_2::
date = 1991
sexe = féminin
score = 32007
alias = Sonic
9
这将按预期提供以下输出。
<joueur_1date="1985"sexe="masculin"score="18974"alias="Super Mario"/><joueur_2date="1991"sexe="féminin"score="32007"alias="Sonic"/>0
将数据存储在json
变量中
类的readblock有一个方法可以存储数据在json
文件中(存储必须由您完成)。下面的代码将在使用结构之后提供给我们。
<joueur_1date="1985"sexe="masculin"score="18974"alias="Super Mario"/><joueur_2date="1991"sexe="féminin"score="32007"alias="Sonic"/>1
在一个终端中启动,我们获得以下输出,这些输出已经手动格式化。如您所见,我们使用格式[key,value]
来存储由方法readblock.flatdict
和readblock.recudict
给定的python
字典的键和值。您还可以注意到,对于逐字内容,我们使用null
键(这是为了方便其他应用程序从"symmetric"json
变量中提取信息)
<joueur_1date="1985"sexe="masculin"score="18974"alias="Super Mario"/><joueur_2date="1991"sexe="féminin"score="32007"alias="Sonic"/>2
由于函数loadjson
可以将存储在一个字符串或文件中的一个json变量转换为一个平面字典,该字典是类readblock.mkordereddict
的实例,因此您可以很容易地返回到python
字典
如何使用分区?
下面的部分代码片段演示了如何使用允许使用虚拟文件的部分,这些虚拟文件包含由..
此处指示的经典peuf
内容。
<joueur_1date="1985"sexe="masculin"score="18974"alias="Super Mario"/><joueur_2date="1991"sexe="féminin"score="32007"alias="Sonic"/>3
上面我们使用了最小的形式来命名只使用两个等号的部分。你可以使用更多的标志,也许你更喜欢下面的惯例。
<joueur_1date="1985"sexe="masculin"score="18974"alias="Super Mario"/><joueur_2date="1991"sexe="féminin"score="32007"alias="Sonic"/>4
使用这种peuf
文件需要从oryste.section
导入read
或readblock
而不是从oryste.data
对于querypath和json表示,通过将节的名称放入<;..>;