使用MessagePack和LZ4 for Python的简单输入/输出

inpout的Python项目详细描述


python输入

使用Python中的MessagePack和LZ4压缩进行输入/输出的简单库。

安装

您可以使用pip(或任何与pypi兼容的包管理器)进行安装:

pip install inpout

或者,如果您喜欢本地用户安装:

pip install --user inpout

对于Microsoft Windows用户,可能需要通过Python解释器运行pip

python -m pip install inpout

<强>注解:Windows安装需要VisualC++ 14。获得与微软VisualC++构建工具:< HeRF= ="http://VisualStudio.MySoFo.COM/DeLosis/Re="NoFoLoW> http://VisualStudio.微软/com下载/ /p>

用法

要使用此库的功能,只需将其导入到您的python程序中:

import inpout

高级功能

为了使用MessagePack和LZ4压缩保存/加载数据,根命名空间中提供了以下高级便利函数:

  • 加载obj(路径,压缩=无,**kwargs):返回从磁盘上的文件加载的单个对象。

    有关参数的详细信息,请参见data_unpacker()

  • 加载iter(path,compression=none,**kwargs):返回从磁盘上的文件加载的对象的迭代器。

    有关参数的详细信息,请参见data_unpacker()

  • 保存obj(obj,path,compression=none,level=none,**kwargs):将单个对象obj保存到磁盘上的文件。

    有关参数的详细信息,请参见data_pack()

  • 保存iter(iterable,path,compression=none,level=none,**kwargs):将一组对象iterable保存到磁盘上的文件。

    有关参数的详细信息,请参见data_pack()

上下文管理器功能

为了获得更大的灵活性,根命名空间中提供了以下上下文管理器函数:

  • 数据解包器(path,compression=none,**kwargs):创建一个支持可选压缩(lz4)的数据解包器(MessagePack)上下文管理器,用作iterable解包器。

    • 路径:包含要读取的数据的磁盘上文件的路径。
    • 压缩:使用LZ4压缩的布尔标志。如果,则默认为
    • kwargs:直接传递给MessagePack解包程序的关键字参数。见下文。
  • 数据包(path,compression=none,level=none,**kwargs):创建一个支持可选压缩(lz4)的数据包(MessagePack)上下文管理器,用作打包函数。

    • 路径:磁盘上包含写入数据的文件的路径。
    • 压缩:使用LZ4压缩的布尔标志。如果,则默认为
    • 级别:LZ4压缩机的压缩级别。有关详细信息,请参见compressor()
    • kwargs:直接传递给消息包打包程序的关键字参数。见下文。

包装功能

对于使用MessagePack直接打包/解包数据而不进行压缩,在input.packing中提供了以下功能:

  • 压缩(obj,stream,**kwargs):使用MessagePack(支持扩展类型)将单个对象压缩为字节流。

    • obj:要打包的对象。
    • :用于写入数据的字节流。
    • kwargs:直接传递给消息包打包程序的关键字参数。见下文。
  • packb(obj,**kwargs):使用MessagePack(支持扩展类型)打包单个对象并返回压缩字节。

    • obj:要打包的对象。
    • kwargs:传递了directl的关键字参数是给消息包打包机的。见下文。
  • 解包(stream,**kwargs):使用MessagePack(支持扩展类型)解包压缩字节流,并返回单个解包对象。

    • :用于读取数据的字节流。
    • kwargs:直接传递给MessagePack解包程序的关键字参数。见下文。
  • 解包b(压缩,**kwargs):使用MessagePack(支持扩展类型)解包压缩字节,并返回单个解包对象。

    • 压缩的:要解压缩的压缩字节。
    • kwargs:直接传递给MessagePack解包程序的关键字参数。见下文。

压缩功能

对于使用lz4直接压缩/解压缩任意数据而不打包,在input.compression中提供了以下上下文管理器函数:

  • 解压器(路径):创建一个数据解压上下文管理器,用作读卡器。

    • 路径:包含压缩数据的磁盘上文件的路径。
  • 压缩程序(path,level=none):创建一个用作写入程序的数据压缩上下文管理器。

    • 路径:磁盘上包含压缩数据的文件的路径。
    • 级别:要使用的压缩级别。默认为lz4f_compression_max如果none。小于3的值(包括负值)使用快速压缩。HC型压缩的推荐范围为49。更多信息可以在这里找到。

MessagePack的关键字参数

使用MessagePack进行数据打包的函数支持可选的关键字参数kwargs直接传递给MessagePack打包程序和解包程序。下面介绍了一些有用的选项:

  • 使用列表:可以是true(默认)或false

    list是python的默认序列/数组类型。但是元组比列表轻。当性能对程序很重要时,可以在解包时使用use_list=false。需要可散列元素(如dictset的python对象不能将列表用作键,因此将包含元组的数据作为键解包时需要use\list=false

示例

下面是如何使用此库的主要便利功能的示例代码。

fromdatetimeimportdatetimeimportinpout# create some Python objects to test, set and datetime are supported out of the boxobj1=[1,2,3,4,5]obj2=("test",1234)obj3={"test":1234,"test2":5678}obj4={"a","b","c",5,6,7,8}obj5=datetime.now()obj6={(1,2):"tuple_key"}# save all the above objects as a single tuple to diskinpout.save_obj((obj1,obj2,obj3,obj4,obj5),"test1.mp.lz4")# save all the above objects in order to disk one by one (iterator)iterator=(oforoin(obj1,obj2,obj3,obj4,obj5))inpout.save_iter(iterator,"test2.mp.lz4")# save an object with a tuple as key to demonstrate 'use_list=False'inpout.save_obj(obj6,"test3.mp.lz4")# load the first test filedata=inpout.load_obj("test1.mp.lz4")print("DATA=%r"%(data,))# load the second test file (iterator)forobjininpout.load_iter("test2.mp.lz4"):print("OBJ=%r"%(obj,))# load the third test file using tuple types, otherwise it failsdata=inpout.load_obj("test3.mp.lz4",use_list=False)print("DATA=%r"%(data,))# demonstrate the data pack functionwithinpout.data_pack("test4.mp.lz4")aspack:forobjin(obj1,obj2,obj3,obj4,obj5,obj6):pack(obj)# demonstrate the data unpacker functionwithinpout.data_unpacker("test4.mp.lz4",use_list=False)asunpacker:forobjinunpacker:print("OBJ=%r"%(obj,))# demonstrate the data pack function (no compression)withinpout.data_pack("test4.mp",compression=False)aspack:forobjin(obj1,obj2,obj3,obj4,obj5,obj6):pack(obj)# demonstrate the data unpacker function (no compression)withinpout.data_unpacker("test4.mp",compression=False,use_list=False)asunpacker:forobjinunpacker:print("OBJ=%r"%(obj,))

消息包扩展类型

此库支持MessagePack扩展类型,并包括两个标准Python对象的编码器/解码器:set(typecode127)和datetime(typecode126)。它们在导入库时自动注册。

  • 集合对象被序列化为包含其元素的元组,并从这些存储的元组重建。
  • datetime对象被序列化为两个整数的元组(秒,微秒)表示自Unix时代(1970年1月1日,星期四,00:00:00)以来的秒数和微秒数。时区信息用于转换,但不存储,因此datetime对象被重建为原始对象,即没有时区。

您还可以轻松地为python对象创建自己的编码器/解码器,并将它们注册到这个库中,以便在序列化/反序列化期间使用:

importinpoutclassMyType(object):def__init__(self,data1,data2):self.data1=data1self.data2=data2# define a representation for your type (encoder)# we will assign '50' as the typecode for this typedefencode_mytype(obj,packb,ext_type):returnext_type(50,packb((obj.data1,obj.data2)))# define how to create your type from your representation (decoder)defdecode_mytype(data,unpackb):data1,data2=unpackb(data)returnMyType(data1,data2)# register custom encoder/decoders for your typeinpout.packing.register_ext_type_encoder(MyType,encode_mytype)inpout.packing.register_ext_type_decoder(50,decode_mytype)# test saving/loading your typeobj=MyType("test",1234)inpout.save_obj(obj,"test.mp.lz4")obj2=inpout.load_obj("test.mp.lz4")print(obj2.data1,obj2.data2)

您可以为自己的扩展类型使用任何类型代码,但它必须介于0125之间(包括两者)。

有关MessagePack扩展类型的更多信息可以是扩展类型" rel="nofollow">可在此处找到

命令行工具

库中包括以下命令行工具,这些工具由pip自动安装:

  • input p print:迭代并打印此库生成的数据文件。

    此工具基于加载iter函数和使用列表=false关键字参数。如果文件名以.lz4结尾(不区分大小写),则会激活压缩。用法:

    $ inpout-pprint <FILE> <FILE> ...
    

许可证

此软件在Apache许可证2.0下

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

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

推荐PyPI第三方库


热门话题
JavaCenter是JavaFX2中不可执行的窗格   java Docker将容器连接到本地数据库   java无法通过Spring从Redis获得正确的值   java为什么要将数组转换为列表再转换为数组   Java泛型在方法中放入字符串或整数参数   在Cloud Bigtable SDK中找不到java类   java Mavensiteplugin无法加载生成的源(Jaxb)   java GWT序列化和Appengine通道Api   PrintWriter out=new PrintWriter(sWriter)和PrintWriter out=response之间的java差异。getWriter()   空手道DSL中的javascript,在java参数调用中传递变量时如何转义单引号   windows 64位java可以与32位tomcat一起使用   为for循环| Java输入参数   java您可以更改SWT选项卡项的背景和/或前景颜色吗?   用java生成6位pin码   java如何从另一个通量中排除通量中的所有元素   java无法调用“javafx.scene.control.ComboBox.getItems()”,因为“Controller.getMyBox()”的返回值为null   将Java字符串与数组匹配时出现问题   java如何使用HttpsUrlConnection对SSL连接使用代理身份验证?   java如何检查XML元素是否包含CDATA?