es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo se puede obligar a Python a usar la cadena en crudo equivalente a las rutas almacenadas en variables en Windows?

Puede parecer que esta pregunta se ha formulado cientos de veces, pero después de leer cada variante de ella, queda claro que nunca se ha respondido completamente, al menos no en el contexto que estoy experimentando.

Tengo una variable de nombre de archivo que se obtiene a través de un diálogo (en Blender), y necesito tanto usar el nombre de archivo como iterar sobre su directorio. El problema es que Python no puede convertir adecuadamente las barras diagonales inversas en barras diagonales normales.

Aquí está el nombre de archivo: ‘D:\scans\testing\20211201144138\frame00000.json’.

Almacenar esto en una variable produce ‘D:\scans\testing\x8211201144138\x0crame00000.json’.

En otras palabras, una vez que el diálogo pasa el nombre de archivo a la variable, no se puede hacer nada más con ella. El archivo en sí puede abrirse, pero cualquier otra operación en él convierte automáticamente los caracteres de escape.

Aquí hay algunos otros enfoques que he intentado:

1) Intentar un reemplazo usando ‘filename.replace(‘\’,’/’) produce ‘D:/scans\testing\x8211201144138\x0crame00000.json’.

2) Usar ‘pathlib.Path(filename)’ produce un objeto WindowsPath: WindowsPath(‘D:/scans\testing\x8211201144138\x0crame00000.json’).

3) Todo lo que necesito es el directorio y el archivo separados, pero incluso ‘os.path.basename’ produce ‘testing\x8211201144138\x0crame00000.json’.

4) Incluso intentar ‘repr(filename)’ no sirve de nada. Produce “‘D:\scans\testing\x8211201144138\x0crame00000.json'”

5) ‘re.sub(‘\\’,’/’,filename)’ produce ‘D:/scans\testing\x8211201144138\x0crame00000.json’.

Es desconcertante que una operación tan simple en Windows sea tan complicada, como lo he hecho millones de veces en Linux (sí, lo sé). Desafortunadamente, no puedo usar el método de cadena cruda (r’string’) porque esto es una variable, no una cadena. He visto ideas locas por ahí como ‘r'{}'.format(variable)’, pero eso no funciona por razones obvias.

Podría enumerar cientos de otros intentos fallidos, incluyendo abspath, relpath, y encontrar / reemplazar, y todos conducen a ninguna parte. Seguramente hay una forma de tomar un nombre de archivo de ruta completa de un diálogo en Windows (en este caso, Blender) y dividir el directorio y el nombre de archivo por separado?

Si tienes alguna idea de cómo podría resolver este problema, por favor compártela.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con la forma en que Windows trata las barras invertidas () en las rutas de archivo. La barra invertida se utiliza como carácter de escape, por lo que debe escaparse a sí misma (es decir, representada por \ en lugar de ) para que Python la interprete correctamente.

    Para abordar el problema, puede intentar lo siguiente:

    1. Utilice la función os.path.normpath() para normalizar la ruta de archivo, lo que convertirá las barras invertidas en barras diagonales:
    filename = 'D:\scans\testing\2021_12_01_14_41_38\frame_00000.json'
    normalized_path = os.path.normpath(filename)
    

    Esto debería darle 'D:/scans/testing/2021_12_01_14_41_38/frame_00000.json' como la ruta normalizada.

    1. Una vez que tenga la ruta normalizada, puede usar las funciones os.path.dirname() y os.path.basename() para separar el directorio y el nombre de archivo:
    dir_name = os.path.dirname(normalized_path)
    file_name = os.path.basename(normalized_path)
    

    Esto le debería dar 'D:/scans/testing/2021_12_01_14_41_38' como el nombre del directorio y 'frame_00000.json' como el nombre del archivo.

    Tenga en cuenta que la función os.path.normpath() también puede convertir las barras diagonales en barras invertidas en Windows, pero esto no debería afectar el comportamiento del código anterior.

Comments are closed.