datasource是一个简单的包装器,用于使用统一的api获取数据,而不管数据应如何获取。

datasource的Python项目详细描述


https://secure.travis-ci.org/YAmikep/datasource.pnghttps://coveralls.io/repos/YAmikep/datasource/badge.pnghttps://pypip.in/v/datasource/badge.pnghttps://pypip.in/d/datasource/badge.png

datasource是一个简单的包装器,用于使用统一的api获取数据,而不管数据应如何获取。

此库的目的是消除基于数据所在位置而思考所需方法的痛苦:

  • 磁盘上的文件
  • 可通过URL访问的远程文件
  • 内存中的字符串
  • 或者生成数据的iterable/a可调用。

它负责获取数据,并提供“读取器”(类似文件的对象)来实际获取数据。 它可以处理大量数据,同时保持低内存占用。(参见“使用大量数据”一节)

文档

安装

来自PYPI(稳定):

pip install datasource

来自Github(不稳定):

pip install git+git://github.com/YAmikep/datasource.git#egg=datasource

数据源当前需要requests库来获取URL。

主要API

  • datasource.DataSource(target, **kwargs):一个数据源对象

唯一的强制参数是target,它定义了数据的位置。它可以是字符串、可调用或可iterable。

有几个可能的关键字参数:

  • is_file:一个布尔值,用于确保字符串目标实际上被视为文件路径,以便在找不到文件时引发错误。默认情况下,如果文件不存在,则将字符串目标视为原始字符串数据。

以下四个参数仅在数据不在本地可用时才有用,即必须下载或生成。

  • preload:创建对象时触发数据加载的布尔值(默认值:false)。默认情况下,数据源对象是惰性的。
  • ^ TT5}$:要存储在内存中的数据的最大大小。此阈值触发临时文件的创建。(默认值:5MB)
  • buffer_size:缓冲区大小(默认值:512 KB)
  • dir_tmp:创建临时文件的目录

数据源对象

DataSource对象有一个简单的api:

  • is_loadedproperty:告诉是否加载了源,这意味着数据在本地可用
  • load(self):如果尚未加载数据,则将加载数据
  • size(self, force_load=False):数据的大小。如果数据尚未加载,则大小为0,除非将force_load设置为true以确保在返回大小之前加载该数据,否则不会加载该数据。
  • get_reader(self):返回一个“reader”,它是一个类似于文件的对象,您可以使用read方法从中实际获取数据。

默认情况下,数据源对象是惰性的(preload=false)。例如,当提供一个url时,在创建对象时不会下载数据,而是在第一次需要数据时下载数据,也就是在调用get_reader()时。

处理大量数据不会使您耗尽内存

当使用内存中的字符串或文件时,数据已经在本地存储,因此没有额外的工作来获取和存储数据。 但是,在获取远程文件或使用生成器时,您不知道数据的大小。 出于性能考虑,数据默认下载到内存中。但是,为了避免由于大量数据耗尽内存,您可以告诉使用最大内存(Max内存KWAG),以便在达到该阈值时自动创建临时文件(默认值:5 MB),释放内存。此功能确保您可以在获取未知大小的数据时保持对内存的控制。临时文件是在场景后面管理的,在删除数据源对象时将被删除。

您还可以控制缓冲区(buffer_size kwarg,默认值:512 kb)和应创建临时文件的目录(dir_tmp kwarg,默认值:操作系统的默认临时文件夹)。

注意,除非在创建obj时将preload设置为true,否则datasource对象是惰性的。ect,只有当您第一次调用get_reader时,数据才会被获取和存储。

用法和示例

>>>importdatasourceasds# Directly an in-memory string>>>data='ABCDEFGHIJKLMNOPQRSTUVWXYZ'>>>source=ds.DataSource(data)>>>printsource.is_loaded,source.size()True26>>>reader=source.get_reader()>>>printreader.read()ABCDEFGHIJKLMNOPQRSTUVWXYZ# A string as a filepath: absolute path, relative path or path defined with "file://">>>filepath='tests/data/afile.txt'>>>source=ds.DataSource(filepath)>>>printsource.is_loaded,source.size()True26>>>reader=source.get_reader()>>>printreader.read()ABCDEFGHIJKLMNOPQRSTUVWXYZ# A string as a filepath: use is_file to make sure it is considered as a file to raise an Error if the file does not exist>>>filepath='file_does_not_exist.txt'>>>try:...source=ds.DataSource(filepath,is_file=True)...exceptExceptionase:...printeFilenotfound:file_does_not_exist.txt# A callable>>>f=lambda:(chr(c)forcinxrange(65,91))>>>callable(f)True>>>source=ds.DataSource(f)>>>printsource.is_loaded,source.size()# A DataSource is lazy by default so it is not loaded yetFalse0>>>reader=source.get_reader()# get_reader triggers data loading>>>printsource.is_loaded,source.size()True26>>>printreader.read()ABCDEFGHIJKLMNOPQRSTUVWXYZ>>>source=ds.DataSource(f,preload=True)# Set preload to True to load the data at the creation>>>printsource.is_loaded,source.size()True26# A generator>>>gen=(chr(c)forcinxrange(65,91))>>>type(gen)<type'generator'>>>>source=ds.DataSource(gen)>>>printsource.size(force_load=True),source.is_loaded# A DataSource is lazy so use force_load to make sure it is loaded26True>>>reader=source.get_reader()>>>printsource.is_loaded,source.size()True26>>>printreader.read()ABCDEFGHIJKLMNOPQRSTUVWXYZ# An URL>>>url='https://bitbucket.org/YAmikep/datasource/raw/master/tests/data/afile.txt'>>>source=ds.DataSource(url)>>>printsource.is_loaded,source.size()# A DataSource is lazy by defaultFalse0>>>reader=source.get_reader()# get_reader triggers data loading>>>printsource.is_loaded,source.size()True26>>>printreader.read()ABCDEFGHIJKLMNOPQRSTUVWXYZ

贡献

克隆并安装测试依赖项:

$ python setup.py develop
$ pip install -r requirements_tests.txt

确保测试通过:

$ ./scripts/runtests.sh

如果结果显示Ran 0 tests,请在目录上运行以下命令并查看输出:

$ nosetests -vv --collect-only

如果nose跳过可执行文件,则需要将文件模式更改为非可执行。在Mac OS X或Linux上,这可以通过以下方法实现:

$ chmod 644 *.py

如果您无法更改文件模式(例如:与windows共享的vagrant文件夹),可以使用–exe选项运行nose以“在python模块中查找可执行的测试”(从man nosetests):

$ ./scripts/runtests.sh --exe

或者你可以尝试使用毒物:

$ tox

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

推荐PyPI第三方库


热门话题
java使用不安全的方法复制整个C结构?   java JavaFx表格视图滚动错误   java应该向应用服务器或数据库添加逻辑吗   java小程序参数标记的用途是什么?   扩展AbstractTestNGSpringContextTests时,java Autowired spring依赖项在抽象基类中始终为空   java1。4关于java版本1.3到1.4   java MVC循环依赖   Java中的oauth电子邮件同步   java Facebook/Parse登录行为异常:代理应用程序尚未安装   java JPA不持久化对象J2EE   如何使用java读取和修改存储在FTP服务器上的图像文件   java测试时为什么要创建/删除testdatabase?   CriteriaBuilder查询中不区分java重音   使用Java从http url获取文件扩展名   Java多维数组/打印空值   java Javax持久性无法在maven上编译   使用mac地址的java制造商名称   java将图像旋转到“指向”鼠标位置   tiff如何打开一个非常大的幻灯片图像,如下所示。使用Java的tif图像文件?   内存Java:是否将Xms设置为XX:PermSize或XX:MaxPermSize?