orsyste是一个使用人类高效语法在txt文件中存储和读取简单结构化数据的工具。

orpyste的Python项目详细描述


关于此软件包

orpyte是一个pystore的anagram,它的构建使处理文本数据变得容易,并存储在文本文件中。

如果你想要更多的信息和例子,只需要 查看文档字符串。

请原谅我的英语…

英语不是我的母语,所以如果你注意到我的文档和代码中存在误解、拼写错误或语法错误,请友好对待。

这个版本的新功能是什么?

此版本仅更新–pypi的设置。

这个版本的新功能是什么?

无法再缩进节和注释(对于节,此功能确实是个错误)。

这个版本的新功能是什么?

一个有用的新功能:您现在可以使用分区在单个物理文件中聚合不同的虚拟文件。

上一版本的新功能是什么?

此版本中有一些重要的更改。

  1. 对于同一块中的可重复键,已完全实现模式multikeyVal

  2. 您现在可以使用上下文管理器来处理类readreadblockclean。通过将与…作为…:,您让包调用方法buildremove_extras(最后一个方法的名称是removebefore)

  3. 类的readblock不再具有flatdict和recudict方法。相反,它有两个属性flatdicttreedict允许使用类似于dict的变量。对于自定义词典,可以使用新方法mydict

  4. infos的旧方法rtu datas已被属性rtu替换,该属性的输出更易于"理解",并且还有一个迭代器yrtu来处理类readreadblock

  5. < > >

    为什么还要用另一种微小的语言来存储文本数据呢?

    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...
    
    
    ////
    

    让我们解释一下前面示例的内容。

    1. 您可以使用类似于c的注释对peuf文件进行注释,但注释只能从一行的最开始处开始

    2. 数据以三种不同类型的数据块结构。

      • 块用两个连续的两点表示,其内容缩进。

      • 块可以是类似块book的容器。这是用来收集不同区块的。

      • general存储键值数据,可以选择分隔符。这里我们使用了=但这不是一项义务。您也可以选择允许或不允许多次使用同一个密钥,

      • 最后一种块用于逐字记录内容。最后的空行将被删除,除非您像我们所做的那样使用magic注释///。在我们的示例中,blockresume有一个由组成的内容,这本书是对时间流逝的颂歌…后面跟着两个空行。

    3. < > >

      逐行读取数据

      让我们考虑下面的文件,其中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

      readblockread的子类,因此您可以使用任何与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

      readreadblock允许使用"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.flatdictreadblock.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导入readreadblock而不是从oryste.data

      对于querypath和json表示,通过将节的名称放入<;..>;

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

      推荐PyPI第三方库


热门话题
Java:字符串。RTL设备语言用标志“+”格式化,数字后加符号   java GAE作为桌面应用程序(Swing)的服务提供商   java将InputStream转换为FileInputStream不适用于Apache POI   java外部Voronoi库“网格”:什么是草图和处理?   重载重写的泛型方法java   java显示组织上设置的错误。springframework。验证。jsp中的错误对象   java一些Spring模型属性没有显示在我的JSP中   java无法编译Guava 23的SimpleTimeLimiter示例   java如何更改JTree中的“根”目录名?   java如何在安卓中对相对布局产生连锁反应?   java错误:org。冬眠例外SQLGrammarException:无法提取结果集,dateAccessed是未知列   如何使用java监听JSON文件更新   由抽象封闭类创建的匿名内部类能否通过反射确定实现类?