O que o arquivo de configuração de formato de utilização para o usuário-amigável cadeias de caracteres arbitrárias bytes?

StackOverflow https://stackoverflow.com//questions/9687841

Pergunta

Então eu fiz um script de Python curto para arquivos de inicialização no Windows com extensões ambíguas através da análise dos seus número mágico/assinatura do ficheiro primeiro:

Gostaria de compilá-lo para um .exe para tornar a associação mais fácil (usando bbfreeze ou reescrita em C), mas eu preciso de algum tipo de user-friendly arquivo de configuração para especificar a correspondência de cadeias de caracteres de byte e programa de caminhos.Basicamente, eu quero colocar esta informação em um arquivo de texto sem formatação alguma forma:

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', 
}

(Os bytes hexadecimais são apenas arbitrárias bytes, não Unicode caracteres.)

Eu acho que um .py arquivo neste formato funciona, mas eu tenho que deixá-lo uncompiled e, de alguma forma, ainda importá-lo para o arquivo compilado, e ainda há um monte de estranhos conteúdo, como { e , de ser confundido por/estragar.

Eu olhei para o YAML, e seria ótimo, exceto que ele requer base64 codificação binária coisas em primeiro lugar, que não é realmente o que eu quero.Eu prefiro o arquivo de configuração para conter hex representações de bytes.Mas também ASCII representações, se isso é tudo o arquivo de assinatura.E, talvez, também regexes.:D (caso o formato baseado em XML pode ser escrito com diferentes quantidades de espaço em branco, por exemplo)

Qualquer idéias?

Foi útil?

Solução

Você já tem sua resposta:YAML.

Os dados que você postou acima é o armazenamento de representações em forma de texto de dados binários;que vai ser bom para YAML, você só precisa analisá-lo corretamente.Normalmente, você usaria algo do binascii módulo;neste caso, provavelmente o binascii.a2b_qp função.

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

Para esclarecer, vou usar um caractere unicode como uma maneira fácil para colar dados binários para o 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'  

Outras dicas

Eu sugiro fazer isso de maneira um pouco diferente.Gostaria de dissociar estas duas definições de uns e outros:

  1. Número mágico assinatura ===> mimetype
  2. mimetype ==> lançador de programa

Para a primeira parte, gostaria de usar python-magia, uma biblioteca que possui ligações para libmagic.Você pode ter o python-magic usar um personalizado magia arquivo como este:

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

Os usuários podem especificar uma personalizada mágica do ficheiro de mapeamento de números mágicos para mimetypes.A sintaxe da magia arquivos é documentado.Aqui está um exemplo mostrando a magia do arquivo para o formato 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

A segunda parte, então, é muito fácil, já que você só precisa especificar dados de texto agora.Você poderia ir com um INI ou yaml formato, como sugerido por outros, ou você pode até ter apenas um simples arquivo delimitado por tabulação, como este:

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

Eu usei alguns pacotes para construir arquivos de configuração, também yaml.Eu recomendo que você use ConfigParser ou ConfigObj.

Na última, a melhor opção Se você quer construir um ser humano-legível arquivo de configuração com comentários eu recomendo fortemente que use ConfigObj.

Divirta-se!

Exemplo de ConfigObj

Com este código:

Você pode usar ConfigObj para armazená-los também.Tente este:importação 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()

Você obter este ficheiro:

[Sony]
product = Sony PS3
accessories = controller, eye, memory stick
retail price = $400
binary one = 0b10101101
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top