什么配置文件格式用于任意字节的用户友好字符串?

时间:2012-03-13 16:15:54

标签: python configuration-files binary-data magic-numbers

所以我制作了一个简短的Python脚本,通过首先检查magic number/file signature,在Windows中启动带有模糊扩展名的文件:

我想将它编译为.exe以使关联更容易(使用bbfreeze或在C中重写),但我需要某种用户友好的配置文件来指定匹配的字节字符串和程序路径。基本上我想以某种方式将这些信息放入纯文本文件中:

magic_numbers = {
# TINA
'OBSS': r'%PROGRAMFILES(X86)%\DesignSoft\Tina 9 - TI\TINA.EXE',

# PSpice
'*version': r'%PROGRAMFILES(X86)%\Orcad\Capture\Capture.exe', 
'x100\x88\xce\xcf\xcfOrCAD ': '', #PSpice?

# Protel
'DProtel': r'%PROGRAMFILES(X86)%\Altium Designer S09 Viewer\dxp.exe', 

# Eagle
'\x10\x80': r'%PROGRAMFILES(X86)%\EAGLE-5.11.0\bin\eagle.exe',
'\x10\x00': r'%PROGRAMFILES(X86)%\EAGLE-5.11.0\bin\eagle.exe',
'<?xml version="1.0" encoding="utf-8"?>\n<!DOCTYPE eagle ': r'%PROGRAMFILES(X86)%\EAGLE-5.11.0\bin\eagle.exe',

# PADS Logic
'\x00\xFE': r'C:\MentorGraphics\9.3PADS\SDD_HOME\Programs\powerlogic.exe', 
}

(十六进制字节只是任意字节,而不是Unicode字符。)

我猜这种格式的.py文件有效,但我必须将其保留为未编译状态,并以某种方式将其导入已编译的文件中,并且仍有一些无关的内容,如{和{{1}被搞砸了/搞砸了。

我看了YAML,除了它首先需要base64编码二进制文件之外它会很棒,这不是我想要的。我更喜欢配置文件包含字节的十六进制表示。但也是ASCII表示,如果那是所有的文件签名。也许还有正则表达式。 :D(例如,如果基于XML的格式可以用不同数量的空格写入)

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

你已经得到了答案:YAML。

您在上面发布的数据是存储二进制数据的文本表示;这对YAML来说很好,你只需要正确地解析它。通常你会使用binascii模块中的东西;在这种情况下,可能是binascii.a2b_qp函数。

magic_id_str = 'x100\x88\xce\xcf\xcfOrCAD '
magic_id = binascii.a2b_qp(magic_id_str)

为了阐明,我将使用unicode字符作为将二进制数据粘贴到REPL(Python 2.7)的简单方法:

>>> a = 'Φ'  
>>> a  
'\xce\xa6'  
>>> binascii.b2a_qp(a)  
'=CE=A6'  
>>> magic_text = yaml.load("""  
... magic_string: '=CE=A6'  
... """)  
>>> magic_text  
{'magic_string': '=CE=A6'}  
>>> binascii.a2b_qp(magic_text['magic_string'])  
'\xce\xa6'  

答案 1 :(得分:1)

我建议这样做有点不同。我会将这两个设置相互分离:

  1. 魔数签名===&gt;的mimetype
  2. mimetype ==&gt;程序启动器
  3. 对于第一部分,我将使用python-magic,一个绑定到libmagic的库。你可以让python-magic使用这样的自定义魔术文件:

    import magic
    m = magic.Magic(magic_file='/path/to/magic.file')
    

    您的用户可以指定将魔术数字映射到mimetypes的自定义魔术文件。魔术文件的语法是documented。这是一个显示TIFF格式的魔术文件的示例:

    # Tag Image File Format, from Daniel Quinlan (quinlan@yggdrasil.com)
    # The second word of TIFF files is the TIFF version number, 42, which has
    # never changed.  The TIFF specification recommends testing for it.
    0       string          MM\x00\x2a      TIFF image data, big-endian
    !:mime  image/tiff
    0       string          II\x2a\x00      TIFF image data, little-endian
    !:mime  image/tiff
    

    第二部分非常简单,因为您现在只需要指定文本数据。您可以按照其他人的建议使用INI或yaml格式,或者您甚至可以使用这样一个简单的制表符分隔文件:

    image/tiff         C:\Program Files\imageviewer.exe
    application/json   C:\Program Files\notepad.exe
    

答案 2 :(得分:-1)

我使用了一些软件包来构建配置文件,也是yaml。我建议您使用ConfigParser或ConfigObj。

最后,最好的选择如果你想构建一个带有注释的人类可读配置文件,我强烈建议使用ConfigObj。

享受!

ConfigObj示例

使用此代码:

您也可以使用ConfigObj存储它们。试试这个:     import configobj

def createConfig(path):
    config = configobj.ConfigObj()
    config.filename = path
    config["Sony"] = {}
    config["Sony"]["product"] = "Sony PS3"
    config["Sony"]["accessories"] = ['controller', 'eye', 'memory stick']
    config["Sony"]["retail price"] = "$400"
    config["Sony"]["binary one"]= bin(173)
    config.write()

你得到这个文件:

[Sony]
product = Sony PS3
accessories = controller, eye, memory stick
retail price = $400
binary one = 0b10101101