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?

¿Fue útil?

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í:

  1. Firma de número mágico===> MIMETYPE
  2. MIMETYPE==> Lanzador de programas
  3. 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top