如何得到路径下的绝对路径并且回传到list上

img


如图所示 我的CBIS-DDSM下面有四种类型的文件夹分别是Mass-Test_, Mass-Training_, Calc-Test_, Calc-Training_, 如下四图

img


img



img



img


然后! 在这四大类的文件夹中, 又分别夹着两个子文件夹. 才会到.dcm档案的地方。 举例!

img


好了, 问题来了。
我该如何分成四个不同的list里面装着Mass-Test_类的dcm 绝对路径, Mass-Training_的绝对路径, Calc-Test的绝对路径,Calc-Training_的绝对路径。
比如:

img


只是这边只分成train和test两个list来装路径,但概念是一样的,并且这个例子的路径没有那么多子文件夹夹在里面。
我到底要怎么忽略那两个子文件夹, 让我的dcm档案路径直接return回list里面呀?
请帮我集思广益,感谢。
希望我的描述够清楚, 可能看起来有点复杂。

写了个示例代码给你


import os

path = "CBIS-DDSM" # 根目录

mass_test_list = []
mass_train_list = []
calc_test_list = []
calc_train_list = []

for root, dirs, files in os.walk(path):
    for dir in dirs:
        if dir.startswith("Mass-Test_"):
            sub_path = os.path.join(root, dir)
            for sub_root, sub_dirs, sub_files in os.walk(sub_path):
                for sub_file in sub_files:
                    if sub_file.endswith(".dcm"):
                        mass_test_list.append(os.path.join(sub_root, sub_file))
        elif dir.startswith("Mass-Training_"):
            sub_path = os.path.join(root, dir)
            for sub_root, sub_dirs, sub_files in os.walk(sub_path):
                for sub_file in sub_files:
                    if sub_file.endswith(".dcm"):
                        mass_train_list.append(os.path.join(sub_root, sub_file))
        elif dir.startswith("Calc-Test_"):
            sub_path = os.path.join(root, dir)
            for sub_root, sub_dirs, sub_files in os.walk(sub_path):
                for sub_file in sub_files:
                    if sub_file.endswith(".dcm"):
                        calc_test_list.append(os.path.join(sub_root, sub_file))
        elif dir.startswith("Calc-Training_"):
            sub_path = os.path.join(root, dir)
            for sub_root, sub_dirs, sub_files in os.walk(sub_path):
                for sub_file in sub_files:
                    if sub_file.endswith(".dcm"):
                        calc_train_list.append(os.path.join(sub_root, sub_file))


定义四个list数组用于分别存储这四个文件夹的文件路径信息,然后,在遍历循环整个文件目录的文件时,判断当前文件夹的名称,从而知道接下下来应该用哪个数组去存储,比如当前目录是Mass-Test那么设置一个变量为1,那么循环该文件目录下的子文件时,根据这个变量的值,为1也用mass-test对应的list存储,为2则用什么什么数组存储。

可以参考一下下面的代码:

import os
import os.path

base_dir = "CBIS-DDSM"
dirs = ["Mass-Test_", "Mass-Training_", "Calc-Test_", "Calc-Training_"]
paths = []
for directory in dirs:
    dir_path = os.path.join(base_dir, directory)
    abs_path = os.path.abspath(dir_path)
    paths.append(abs_path)

print(paths)


您可以使用 Python 的 os 模块和 re 模块来实现该功能。

使用 os.listdir() 方法获取文件夹中的所有文件的文件名。

使用 re.search() 方法查找文件名是否符合要求,并将符合要求的文件路径加入对应的 list 中。

使用 os.path.join() 方法将文件名和文件夹路径合并为绝对路径。

以下是实现代码示例:

python

import os
import re

folder_path = 'your folder path'
mass_test_list = []
mass_training_list = []
calc_test_list = []
calc_training_list = []

for file_name in os.listdir(folder_path):
    file_path = os.path.join(folder_path, file_name)
    if re.search(r'Mass-Test_.*\.dcm', file_name):
        mass_test_list.append(file_path)
    elif re.search(r'Mass-Training_.*\.dcm', file_name):
        mass_training_list.append(file_path)
    elif re.search(r'Calc-Test.*\.dcm', file_name):
        calc_test_list.append(file_path)
    elif re.search(r'Calc-Training.*\.dcm', file_name):
        calc_training_list.append(file_path)

希望这能帮到您!

1.应该在知道目录CBIS-DDSM的绝对路径下去遍历它下面的文件
2.当文件的后缀是.dcm时将文件绝对路径存入列表
3.用一个字典加文件遍历可以解决

实现代码及输出结果示例如下:

import os

root_path = r'C:\Users\xxx\Desktop\development\test\CBIS-DDSM'

# 装着Mass-Test_类的dcm 绝对路径, Mass-Training_的绝对路径, Calc-Test的绝对路径,Calc-Training_的绝对路径。
mass_test_list = []
mass_training_list = []
calc_test_list = []
calc_training_list = []

for root, dirs, files in os.walk(root_path):
    for file in files:
        if file.endswith('.dcm'):
            path = os.path.join(root, file)
            if 'Mass-Test_' in root:
                mass_test_list.append(path)
            elif 'Mass-Training_' in root:
                mass_training_list.append(path)
            elif 'Calc-Test_' in root:
                calc_test_list.append(path)
            elif 'Calc-Training_' in root:
                calc_training_list.append(path)

print(mass_test_list)
print(mass_training_list)
print(calc_test_list)
print(calc_training_list)

输出结果:

['C:\\Users\\xxx\\Desktop\\development\\test\\CBIS-DDSM\\Mass-Test_xxx\\xx1\\xx2\\1-1.dcm']
['C:\\Users\\xxx\\Desktop\\development\\test\\CBIS-DDSM\\Mass-Training_xxx\\xx1\\xx2\\1-1.dcm']
['C:\\Users\\xxx\\Desktop\\development\\test\\CBIS-DDSM\\Calc-Test_xxx\\xx1\\xx2\\1-1.dcm']
['C:\\Users\\xxx\\Desktop\\development\\test\\CBIS-DDSM\\Calc-Training_xxx\\xx1\\xx2\\1-1.dcm']

Process finished with exit code 0

解答不易,还去体验了一把kaggle,希望能帮到你 - 来自一名字节资深后端工程师。

写法:

  • 如果是在windows上运行的程序:

    mass_test = sorted(glob("D:\Kevin_code_task_pytorch\xxxxxxx\CBIS-DDSM\Mass-Test_*\*\*\*.dcm"))
    mass_traning = sorted(glob("D:\Kevin_code_task_pytorch\xxxxxxx\CBIS-DDSM\Mass-Training_*\*\*\*.dcm"))
    calc_test = sorted(glob("D:\Kevin_code_task_pytorch\xxxxxxx\CBIS-DDSM\Calc-Test_*\*\*\*.dcm"))
    calc_traning = sorted(glob("D:\Kevin_code_task_pytorch\xxxxxxx\CBIS-DDSM\Calc-Training_*\*\*\*.dcm"))
    
  • 如果是在线kaggle运行的程序(那你的文件应该上传到了/kaggle/input目录):

    mass_test = sorted(glob("/kaggle/input/CBIS-DDSM/Mass-Test_*/*/*/*.dcm"))
    mass_traning = sorted(glob("/kaggle/input/CBIS-DDSM/Mass-Training_*/*/*/*.dcm"))
    calc_test = sorted(glob("/kaggle/input/CBIS-DDSM/Calc-Test_*/*/*/*.dcm"))
    calc_traning = sorted(glob("/kaggle/input/CBIS-DDSM/Calc-Training_*/*/*/*.dcm"))
    

几个注意点:

- 在windows系统上,路径是反斜杠 \ ,在linux系统上,路径是 / 。这里你根据这个系统实际情况来调整。
- D:\Kevin_code_task_pytorch\xxxxxxx\CBIS-DDSM 和 /kaggle/input/CBIS-DDSM 是大致的写法,你要自己补充成正确的目录。
- sorted是对list排序,比较简单,不展开。
- glob可以获取给定路径下的所有文件列表,并把路径放在一个list中。
- glob的参数支持*通配符,表示模糊匹配。也就是你路径上有变化的部分,简单粗暴放一个*就行了。

匹配示例(windows):

CBIS-DDSM\Mass-Test_*\ 可以匹配以 CBIS-DDSM\Mass-Test_ 开头的目录,如:
- CBIS-DDSM\Mass-Test_123\
- CBIS-DDSM\Mass-Test_124\

CBIS-DDSM\Mass-Test_*\*\ 可以匹配 以 CBIS-DDSM\Mass-Test_ 开头的目录下的任1层目录,如:
- CBIS-DDSM\Mass-Test_123\d1\
- CBIS-DDSM\Mass-Test_123\d2\
- CBIS-DDSM\Mass-Test_124\d3\
- CBIS-DDSM\Mass-Test_124\d4\

CBIS-DDSM\Mass-Test_*\*\*\ 可以匹配 以 CBIS-DDSM\Mass-Test_ 开头的目录下的任2层目录,如:
- CBIS-DDSM\Mass-Test_123\d1\e1\
- CBIS-DDSM\Mass-Test_123\d2\x1\
- CBIS-DDSM\Mass-Test_124\d3\y1\
- CBIS-DDSM\Mass-Test_124\d4\b1\

CBIS-DDSM\Mass-Test_*\*\*\*.dcm 可以匹配 以 CBIS-DDSM\Mass-Test_ 开头的目录下的任2层目录下,以.dcm结尾的文件,如:
- CBIS-DDSM\Mass-Test_123\d1\e1\k1.dcm
- CBIS-DDSM\Mass-Test_123\d2\x1\k2.dcm
- CBIS-DDSM\Mass-Test_124\d3\y1\k3.dcm
- CBIS-DDSM\Mass-Test_124\d4\b1\k4.dcm

匹配示例(linux):

CBIS-DDSM/Mass-Test_* 可以匹配以 Mass-Test_ 开头的目录,如:
- CBIS-DDSM/Mass-Test_123/
- CBIS-DDSM/Mass-Test_124/

CBIS-DDSM*/ 可以匹配 以 CBIS-DDSM/Mass-Test_ 开头的目录下的任1层目录,如:
- CBIS-DDSM/Mass-Test_123/d1/
- CBIS-DDSM/Mass-Test_123/d2/
- CBIS-DDSM/Mass-Test_124/d3/
- CBIS-DDSM/Mass-Test_124/d4/

CBIS-DDSM*/*/ 可以匹配 以 CBIS-DDSM/Mass-Test_ 开头的目录下的任2层目录,如:
- CBIS-DDSM/Mass-Test_123/d1/e1/
- CBIS-DDSM/Mass-Test_123/d2/x1/
- CBIS-DDSM/Mass-Test_124/d3/y1/
- CBIS-DDSM/Mass-Test_124/d4/b1/

CBIS-DDSM*/*/*.dcm 可以匹配 以 CBIS-DDSM/Mass-Test_ 开头的目录下的任2层目录下,以.dcm结尾的文件,如:
- CBIS-DDSM/Mass-Test_123/d1/e1/k1.dcm
- CBIS-DDSM/Mass-Test_123/d2/x1/k2.dcm
- CBIS-DDSM/Mass-Test_124/d3/y1/k3.dcm
- CBIS-DDSM/Mass-Test_124/d4/b1/k4.dcm

提供参考实例【Python获取当前目录下所有文件的绝对路径并放在list中】,链接:https://blog.csdn.net/judgechen1997/article/details/100853820

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^