【问题标题】:Creating arrays based on folder name根据文件夹名称创建数组
【发布时间】:2021-09-27 11:00:36
【问题描述】:

我的数据已收集并整理在多个文件夹中。
在每个文件夹中,可以有多个类似的运行——例如在相同的条件下,在不同的时间收集数据。这些文件名中包含一个递增的数字。每个文件夹都包含在不同条件下收集的相似数据。例如,我可以有一个idle folder,其中可以有名为idle_1.csvidle_2.csvidle_3.csv 等的文件。然后我可以有另一个文件夹pos1 folder,类似地,pos1_1.csv、@ 987654327@等

为了跟踪数组中的数据来自哪个文件夹和哪个文件,我想使用文件夹名称“idle”、“pos1”等作为数组名称。然后,该文件夹中的每个文件(或处理该文件夹中每个文件产生的数据,而是)成为该数组中的另一行。

例如,如果文件夹名称存储在变量 arrname 中,文件索引存储在变量 arrndx 中,我想将值写入该数组:

arrname[arrndx]=value

这不起作用,出现以下错误:

TypeError: 'str' object does not support item assignment

然后,我考虑使用字典来执行此操作,但我想我仍然会遇到同样的问题。如果我使用字典,我想我需要每个字典的名称都是从文件夹名称派生的名称——创建相同的问题。如果我尝试将其用作字典中的键,则条目将被同一文件夹中每个文件的数据覆盖,因为名称相同:

    arrays['name']=arrname
    arrays['index']=int(arrndx)
    arrays['val']=value

    arrays['name': arrname, 'index':arrndx, 'val':value]

我也不能使用“索引”,因为它在每个不同的文件夹中都不是唯一的。

所以,我被难住了。我想我可以预定义所有数组,然后根据变量名写入正确的数组,但这可能会导致一个大的 case 语句(python 中有这样的东西吗?)或一个大的 if 语句。也许在我的情况下无法避免这种情况,但我认为必须有一种更优雅的方式......

编辑

我能够使用 globals() 解决我的问题:

globals()[arrname].insert(int(arrndx),value)

但是,我认为这不是“正确”的解决方案,尽管我不明白为什么这样做会令人不悦。

【问题讨论】:

    标签: python arrays dictionary dynamic


    【解决方案1】:

    怎么样:

    foldername = 'idle'  # Say your folder name is idle for example 
    files = {}
    files[filename] = [filenmae + "_" + str(i) + ".csv" for i in range(1, number_of_files_inside_folder + 2)]
    

    这能解决你的问题吗?

    【讨论】:

    • 谢谢。在分配“空闲”后,我没有看到使用的“文件夹名”。你能用文字解释一下代码在做什么吗?
    【解决方案2】:

    使用嵌套字典,第一级是文件夹名称,第二级是文件索引(或名称)。

    from pathlib import Path
    
    data = {}
    base_dir = 'base'
    for folder in Path(base_dir).resolve().glob('*'):
        if not folder.is_dir():
            continue
        data[folder.name] = {}
        for csv in folder.glob('*.csv'):
            file_id = csv.stem.split('_')[1]
            data[folder.name][file_id] = csv
    

    上面的示例只是将文件名保存在结构中,但您也可以加载文件的数据(例如使用 Pandas)并将其保存到字典中。这完全取决于您以后想用它做什么。

    【讨论】:

    • 我会和你一起玩,然后回复你....我想我可以按照你正在做的事情做我想做的事。我能够使用全局变量,查看编辑来解决我的问题,但我知道这不是“正确”的方式......
    • 我会说globals() 解决方案不受欢迎,因为它不寻常(因此更难阅读和理解)并且由于其广泛的副作用而更难推理。它违反了Zen of Python 中的几个原则
    猜你喜欢
    • 1970-01-01
    • 2021-07-13
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多