浏览包含许多文件的文件夹,并以Python输出文件名信息的矩阵/电子表格

浏览包含许多文件的文件夹,并以Python输出文件名信息的矩阵/电子表格,python,Python,我有文件夹,其中包含数十个患者眼部数据文件。文件名包含受试者标识符、检查名称、眼睛名称OD vs OS以及执行检查的就诊。示例文件名包括: AAA-1001_exam1_OD_screening.txt AAA-1001_exam1_OS_screening.txt AAA-1001_exam1_OS_baseline.txt AAA-1001_exam1_OD_month1.txt AAA-1001_exam1_OS_month1.txt AAA-1001_exam1_OS_month2.

我有文件夹,其中包含数十个患者眼部数据文件。文件名包含受试者标识符、检查名称、眼睛名称OD vs OS以及执行检查的就诊。示例文件名包括:

AAA-1001_exam1_OD_screening.txt 
AAA-1001_exam1_OS_screening.txt
AAA-1001_exam1_OS_baseline.txt
AAA-1001_exam1_OD_month1.txt 
AAA-1001_exam1_OS_month1.txt
AAA-1001_exam1_OS_month2.txt
AAA-1001_exam1_OS_month3.txt
BBB-2001_exam1_OD_baseline.txt 
BBB-2001_exam1_OS_baseline.txt
我想浏览所有文件并输出一个包含主题信息的矩阵——主题标识符位于左侧,访问标识符位于顶部。X表示文件存在,这使我能够直观地看到丢失数据的位置。下面是一个例子:

最终,输出可以在Excel中,每个考试类型都有一个单独的选项卡,但现在我只是想知道如何解决这个问题。我需要解析文件名并填充数组吗?请帮我开始

您可以使用os.listdir获取目录中的文件名列表,然后使用for循环遍历它们。对于每个文件名,可以使用.split获取文件名的不同部分。然后,您可以按如下方式处理和分类文件名的每个元素:

import os

data = {}

for filename in os.listdir("path/to/directory"):
    list_of_segements = filename.split('_')
    id = list_of_segments[0]
    exam = list_of_segments[1]
    eye = list_of_segments[2]
从这里开始,我将为每个ID创建一个类,如下所示:

class Patient():

    def __init__(self, id):
        self.id = id
        self.od = {'screening': False, 'baseline': False, 'month1': True, 'month2': False, 'month3': False}
        self.os = {'screening': False, 'baseline': False, 'month1': True, 'month2': False, 'month3': False}

    def add_file(self, eye, type):
        eye_dict = self.od if eye == "OD" else self.os
        try:
            eye_dict[type] = True
        except KeyError:
            print(f"Invalid exam type: {type}"

patients = {}

for filename in os.listdir("path/to/directory"):
    list_of_segements = filename.split('_')
    id = list_of_segments[0]
    exam = list_of_segments[1]
    eye = list_of_segments[2]
    type = list_of_segments[3].split('.')[-1]
    if id not in patients:
        patients[id] = Patient(id)
    patients[id].add_file(eye, type) # Edited

一旦获得了所有这些数据,就可以遍历该患者字典并使用将数据输出到CSV文件


完整免责声明,我还没有测试过任何代码,但逻辑应该是合理的。希望这能帮助您实现目标。

如果您的输出示例与示例输入数据匹配,这将非常有用。例如,在您的输出中,有一行的所有列都是x'd。文件名中怎么会出现这种情况?@Ahndwoo,谢谢。我对文件列表进行了一些更新以匹配输出。本练习的重点是查看文件丢失空值的位置。@gadkins我明白了。我已经更新了我的答案,使之更加完整。有很多方法可以组织数据,我给你举了一个例子。如果您需要我澄清任何事情,请尝试一下并在我的答案上留下评论。您能否澄清“init”方法中成员变量的字典值是如何填充的?根据包含所有文件的文件夹中是否存在文件,每次就诊筛选、基线等的值将为真或假。例如,AAA-1001 OD文件夹中有一个用于筛选的文件和一个用于Month1的文件,但没有用于基线、Month2和Month3的文件。为了澄清,我的目标是遍历文件夹中的文件,并根据文件的存在/不存在填充矩阵。TY.@gadkins\uuuuu init\uuuu中的字典刚刚用默认值初始化。只要在患者词典中找不到相关id,就会创建患者实例。从这里开始,每次您遇到一个文件ID确实存在于您的患者词典中的文件时,您都会访问该类实例,并根据哪个眼睛和文件类型更新正确的词典。@gadkins实际上,回顾代码,我想我犯了一个小错误:最后一行不应该出现在前面的if语句中。无论患者字典中是否存在具有该ID的患者的现有实例,都应调用add_file方法,因为如果该实例不存在,我们将创建它。我编辑了代码以反映这一点