¿Qué formato de archivo de configuración utilizar para cadenas de bytes arbitrarios fáciles de usar?
-
13-12-2019 - |
Pregunta
Así que hice un breve script de Python para iniciar archivos en Windows con extensiones ambiguas examinando su número mágico/firma de archivo primero:
Me gustaría compilarlo en un .exe para facilitar la asociación (ya sea usando bbfreeze o reescribiéndolo en C), pero necesito algún tipo de archivo de configuración fácil de usar para especificar las cadenas de bytes coincidentes y las rutas de programa.Básicamente quiero poner esta información en un archivo de texto plano de alguna manera:
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',
}
(Los bytes hexadecimales son solo bytes arbitrarios, no caracteres Unicode).
Supongo que un archivo .py en este formato funciona, pero tengo que dejarlo sin compilar y de alguna manera importarlo al archivo compilado, y todavía hay un montón de contenido extraño como {
y ,
confundirse con / arruinar.
Miré YAML y sería genial, excepto que primero requiere cosas binarias con codificación base64, que no es realmente lo que quiero.Preferiría que el archivo de configuración contenga representaciones hexadecimales de los bytes.Pero también representaciones ASCII, si eso es todo lo que es la firma del archivo.Y tal vez también expresiones regulares.:D (En caso de que el formato basado en XML pueda escribirse con diferentes cantidades de espacios en blanco, por ejemplo)
¿Algunas ideas?
Solución
Ya tienes tu respuesta:YAML.
Los datos que publicó arriba almacenan representaciones de texto de datos binarios;eso estará bien para YAML, solo necesitas analizarlo correctamente.Normalmente usarías algo del módulo binascii;en este caso, probablemente el binascii.a2b_qp
función.
magic_id_str = 'x100\x88\xce\xcf\xcfOrCAD '
magic_id = binascii.a2b_qp(magic_id_str)
Para aclararlo, usaré un carácter Unicode como una manera fácil de pegar datos binarios en 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'
Otros consejos
Sugeriría hacer esto un poco diferente. Decocaría estas dos configuraciones entre sí:
- Firma de número mágico===> MIMETYPE
- MIMETYPE==> Lanzador de programas
Para la primera parte, usaría Python-Magic , una biblioteca que tiene enlaces a libmagic . Puedes tener Python-Magic Utilice un archivo mágico personalizado como este:
import magic
m = magic.Magic(magic_file='/path/to/magic.file')
Sus usuarios pueden especificar un archivo mágico personalizado Mape Mape Números mimetypes. La sintaxis de los archivos MAGIC es documentado . Aquí hay un ejemplo que muestra el archivo mágico para el 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
La segunda parte es bastante fácil, ya que solo necesita especificar los datos de texto ahora. Podría ir con un formato INI o YAML, según lo sugerido por otros, o incluso podría tener un simple archivo delimitado por la pestaña como esta:
image/tiff C:\Program Files\imageviewer.exe
application/json C:\Program Files\notepad.exe
He usado algunos paquetes para crear archivos de configuración, también YAML.Le recomiendo que use ConfigParser o Configobj.
Por fin, la mejor opción Si desea construir un archivo de configuración legible por humanos con los comentarios, recomiendo encarecidamente usar Configobj.
disfrutar!
Ejemplo de Configobj
Con este código:
Puede usar Configobj para almacenarlos también.Prueba este: Importar 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()
obtienes este archivo:
[Sony]
product = Sony PS3
accessories = controller, eye, memory stick
retail price = $400
binary one = 0b10101101