使用python 3实现键入tsv的简单格式
typedtsv的Python项目详细描述
类型DTSV
typed tsv:使用python 3实现输入tsv的简单格式。
在pypi上可用:https://pypi.org/project/typedtsv/
安装时使用:pip install typedtsv
请参阅代码并在此处留下反馈:https://github.com/jimmybot/typedtsv
为什么?
json、yaml、toml和其他简单的格式不是为类似列表/表的数据集构建的。
yaml的速度特别慢,因为它具有扩展的特性集,而json(对于单个对象而不是集合)是不可分块的。我曾经把所有的pypi包信息都存储在一个yaml文件中,读出来需要半天时间。使用死板的简单换行分隔的json格式,使得解析只需几秒钟。
换行分隔的json很方便,在解析时出错的可能性很小,性能也很好。缺点是支持的类型有点太有限(没有int vs float),而且也不容易被人阅读或编辑。
toml特别针对配置文件,并且类似地解析单个dictionary对象而不是集合的结果。
csv/tsv格式有太多的模糊性,导致在文件本身之外包含重复的自定义解析逻辑。csv引号转义也会导致解析性能差。
目标
- 简单点
- 快一点
- 易于并行化
- 是csv/tsv/json和简单使用yaml的更好选择
- 支持开放数据和数据共享/存档。将有关数据集的信息推送到数据文件中,以便将来重现
考虑用例
- 开放数据的数据库不可知、程序不可知的简单文件格式
- 共享可重复数据科学数据集的快速串行化格式
- 易于创建、易于编辑、易于理解的测试数据库设备
非目标
- 无限扩展性a la yaml
- 配置文件。重点是对象列表/表格数据
格式
格式是一个普通的tsv,除了标题行使用冒号格式来注释类型:
<col_name>:<col_type>\t<col_name2>:<coL_type2>...
例如:
# I'm a comment and will be ignored
url:str n_times:int score:float
https://www.example.com 5 1.6
https://archive.org 99 9.9
最初的传递集中在python的基本类型和json上。当前有效类型为:
Type | Notes |
---|---|
int | |
float | |
bool | Valid values: true, false, t, f, yes, no, y, n, 1, 0 |
str | Newlines, tabs, \, and # must be escaped |
datetime | '2011-01-01 00:00:00' Without timezone assumes UTC |
json | |
null | All types are nullable with value 'null'. To get literal string 'null', use '\null' |
支持注释,仅以作为前缀。在带有一个反斜杠“\”的字符串中实际转义。
行分隔符仅使用'\n'
。窗口换行符,'\r\n'
无效。
我们永远不允许使用引号'\n'
,因为这将使文件难以分块,从而使并行读取变得困难。
gotchas:
- 在python中,您需要小心打开可能包含windows新行的文件:
infile=open('data.ttsv','r',newline='\n')# must set newline='\n' because default for newline is '\n' or '\r' or '\r\n'
- typedtsv.dumps可以从数据的第一行推断列类型,但如果有任何
null
的,则不能推断列类型。在这种情况下,请使用常规的orderedict方法定义列名和类型
待办事项:
添加布尔类型添加空值添加日期时间/日期/时间类型:需要避免歧义,同时支持常见用法人体工程学:可以选择读取和转储单个数据列表,而不是处理列表列表- 使用与f:https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/units-of-measure
- 可能:扩展格式以支持列注释/其他公共元数据
- 可能:支持数组和映射类型以与Postgres兼容
- 可能:支持日期、时间和/或时间间隔类型
开发
确保已安装诗歌:https://github.com/sdispater/poetry
git clone git@github.com:jimmybot/typedtsv.git
cd typedtsv
poetry install
poetry shell
pytest