Resuelva el problema de que Python lee la ruta de la imagen con caracteres de escape

Una solución general al problema de los caracteres de escape en las rutas

La solución general al problema de los caracteres de escape no es más que los tres siguientes.

1. Agregue r antes de la ruta

Agregue r directamente en frente de la ruta, este método puede mantener el significado original de los caracteres.

Por ejemplo, lo siguiente:

path=r"D:\MindSpore\Dearui\source\ces\0AI.png"

2. Reemplace la barra diagonal inversa "\" con una barra diagonal

path="D:\MindSpore\Dearui\source\ces/0AI.png"

3. Reemplace la barra invertida "\" con una doble barra invertida "\\"

path="D:\\MindSpore\\Dearui\\source\\ces\\0AI.png"

Use os para leer la ruta de la imagen

Aquí usamos os para conectar nombres de carpetas y nombres de archivos.

El método específico es el siguiente:

paths=r"D:\MindSpore\Dearui\source\ces"
imgfile = []
file_list = os.listdir(paths)
for i in file_list:
    newph = os.path.join(paths, i)
    imgfile.append(newph)
print(imgfile)

Finalmente, primero imprimimos esta lista directamente.

['D:\\MindSpore\\Dearui\\source\\ces\\0AI.png', 'D:\\MindSpore\\Dearui\\source\\ces\\AI2.png', 'D:\\ MindSpore\\Dearui\\fuente\\ces\\AI3.png']

Al usar os aquí, puede ver que las barras invertidas dobles se usan automáticamente, lo que evita efectivamente los caracteres de escape, pero hay un problema relacionado con el mecanismo de lectura de la lista.

for f in imgfile:
    print(f)

Generalmente, usamos el bucle for para obtener la ruta de la imagen en la lista, pero aquí no es como pensaba.

D:\MindSpore\Dearui\source\ces\0AI.png
D:\MindSpore\Dearui\source\ces\AI2.png
D:\MindSpore\Dearui\source\ces\AI3.png

Usando el bucle for para leer, las barras invertidas dobles se han cambiado a barras simples, lo que conduce a caracteres de escape en la ruta de lectura, lo que puede implicar el problema del mecanismo de lectura. Los detalles no se mencionan aquí. Después de explorar, hablemos de la solución a continuación.

El enfoque adoptado en este trabajo

Simplemente a través del sistema operativo, la ruta que obtenemos es doble barra invertida.Después de todo, incluso '\' es un carácter de escape, y realmente no tenemos forma de cambiarlo.

newph = os.path.join(paths, i).replace("\\","/")

Esta modificación puede completar la modificación del carácter de escape y el valor impreso a través del bucle for también es elegible.

El bucle for imprime:

D:/MindSpore/Dearui/source/ces/0AI.png
D:/MindSpore/Dearui/source/ces/AI2.png
D:/MindSpore/Dearui/source/ces/AI3.png
Listados:

['D:/MindSpore/Dearui/source/ces/0AI.png', 'D:/MindSpore/Dearui/source/ces/AI2.png', 'D:/MindSpore/Dearui/source/ces/AI3.png ']

Esta función también está incluida en pyzjr por mí, y solo se puede ver después de descargar la versión 0.0.19.

pip install pyzjr==0.0.19
def getPhotopath(paths):
    """
    * log:0.0.19以后修改了一个比较大的bug,使用os读取的路径是“\\”,本来是没有问题的,
    但如果使用列表循环读取,居然变成了单斜杠。
    * 功能:批量读取文件夹下的图片路径
    :param paths: 文件夹路径
    :return: 包含图片路径的列表
    """
    imgfile = []
    file_list = os.listdir(paths)
    for i in file_list:
        if i[0] in ['n', 't', 'r', 'b', 'f'] or i[0].isdigit():
            print(f"Error: 文件名 {i} 开头出现错误!")
        newph = os.path.join(paths, i).replace("\\","/")
        imgfile.append(newph)
    return imgfile

Aquí agregué una pista, que puede señalar qué archivo puede estar mal, para facilitar la búsqueda de problemas posteriores. El que se puede modificar manualmente es en realidad el último, pero si insiste en usarlo, no hay problema. .

correcto:

En la actualidad, esta función se ha mejorado y se pueden descargar pip install pyzjr==1.0.5 y versiones superiores:

def getPhotopath(paths,cd=False,debug=True):
    """
    * log
        0.0.19以后修改了一个比较大的bug
        1.0.2后将图片和所有文件路径分开
        1.0.5功能全部完善,不会再进行更新
    :param paths: 文件夹路径
    :param cd:添加当前运行的路径名
    :param debug:开启打印文件名错误的名字
    :return: 包含图片路径的列表
    """
    img_formats = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tif', 'tiff', 'webp', 'raw']
    imgfile = []
    allfile = []
    file_list = os.listdir(paths)
    for i in file_list:
        if debug:
            if i[0] in ['n', 't', 'r', 'b', 'f'] or i[0].isdigit():
                print(f"Error: 文件名 {i} 开头出现错误!")
        newph = os.path.join(paths, i).replace("\\", "/")
        allfile.append(newph)
        _, file_ext = os.path.splitext(newph)
        if file_ext[1:] in img_formats:
            imgfile.append(newph)
    if cd:
        cdd = getcwd()
        imgfile = [os.path.join(cdd, file).replace("\\", "/") for file in imgfile]
        allfile = [os.path.join(cdd, file).replace("\\", "/") for file in allfile]
    return imgfile,allfile

No se esperan más correcciones en el futuro.

Supongo que te gusta

Origin blog.csdn.net/m0_62919535/article/details/132199978
Recomendado
Clasificación