O que o arquivo de configuração de formato de utilização para o usuário-amigável cadeias de caracteres arbitrárias bytes?
-
13-12-2019 - |
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?
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:
- Número mágico assinatura ===> mimetype
- 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