Python 3库,用于从SongBeamer格式导入和导出。
项目描述
icemac.songbeamer
用于读取和写入SongBeamer文件的库。
本软件包使用MIT许可证,请参阅包内的LICENSE.TXT文件。
支持的SongBeamer版本
目前支持Songbeamer版本2到4。(.sng文件中的内部版本号:#Version=3。)
支持的Python版本
仅在Python 3.7上运行。不支持旧版本的Python。
运行测试
要运行测试,请调用
$ tox
(您可能需要先使用:pip install tox安装tox。)
黑客攻击
更改
1.0 (2018-11-02)
向后不兼容的更改
icemac.songbeamer.SNG实例不再在data属性中存储数据,现在它表现得像一个dict,从而可以直接访问数据。
现在无法再使用icemac.songbeamer.SNG实例的属性来读取和存储编码的字节数据。可以使用dict API从icemac.songbeamer.SNG实例读取/写入文本数据,或者使用parse函数(见下一条)导入数据,或使用.SNG.export()导出编码的数据。
添加了一个函数icemac.songbeamer.parse(),将字节流转换为icemac.songbeamer.SNG实例。它取代了SNG实例上的类方法。如果数据无法解析,则返回None并记录错误消息。
不再支持Python 3.5、3.6和PyPy3,因此现在只支持Python 3.7。
功能
添加了一个函数icemac.songbeamer.open(),用于打开给定路径的文件并获取一个icemac.songbeamer.SNG实例。
使.SNG.export()能够抵御歌曲中缺少文本的情况。
添加了一个命令行脚本songbeamer-xls-export,它将包含SongBeamer文件的文件夹中的标题和歌集编号导出到XLS文件中。要使用它,必须以如下方式安装带有xls附加组件的icemac.songbeamer:
$ pip install "icemac.songbeamer[xls]"
支持以UTF-8编码的以UTF-8 BOM开始的SongBeamer文件。
将许可证从ZPL更改为MIT。
0.3 (2018-10-07)
添加对Python 3.5至3.7和PyPy3的支持。
不再支持Python 3.2和3.3。
0.2.0 (2012-10-31)
添加了解析字节数据的能力。
将导出文件中的键排序,以兼容Python 3.2和3.3。
0.1.0 (2012-05-05)
首次公开发布。
待办事项
实现
导入/导出.col文件(日程表)
开放性问题
Transpose和Speed实际上是整数值吗?
使用
导入.sng文件
要导入.sng文件,请在icemac.songbeamer模块中使用open函数。它期望一个文件名和路径,并返回一个SNG实例
>>> import icemac.songbeamer >>> import pkg_resources >>> filename = pkg_resources.resource_filename( ... 'icemac.songbeamer.tests', 'example.sng') >>> sng = icemac.songbeamer.open(filename) >>> sng.__class__ <class 'icemac.songbeamer.sng.SNG'>
或者,在同一个模块中还有一个parse函数,可以将字节(例如从二进制文件中读取的)解析为一个SNG实例
>>> with open(filename, 'rb') as file: ... sng = icemac.songbeamer.parse(file.read()) >>> sng.__class__ <class 'icemac.songbeamer.sng.SNG'>
访问文件数据
SNG实例扩展了dict,因此可以通过常规Python dict API访问日期
>>> from pprint import pprint >>> pprint(sng) {'Author': 'me', 'Text': ['La la la', '---', 'Lei lei lei'], 'Version': 3} >>> sng['Title'] = 'Mÿ šôñg'
值存储为数字或字符串(文本)
>>> sng['Version'] 3 >>> sng['Author'] 'me'
导出.sng文件
>>> from tempfile import TemporaryFile
要导出到.sng文件,请使用export方法。它期望一个字节流(io.BytesIO或打开的二进制文件)作为参数写入
>>> with TemporaryFile() as file: ... sng.export(file) ... _ = file.seek(0) ... pprint(file.readlines()) [b'#Author=me\r\n', b'#Title=M\xff \x9a\xf4\xf1g\r\n', b'#Version=3\r\n', b'---\r\n', b'La la la\r\n', b'---\r\n', b'Lei lei lei']