将输入.csv与输出文件夹python匹配

qltillow  于 2022-12-25  发布在  Python
关注(0)|答案(1)|浏览(164)

我是一个完全的Python新手,所以任何帮助或指针都很感激。我有一个input. csv文件,看起来像这样的~500,000行数据:

dwelling,wall,weather,occ
5,2,Ldn,Pen
5,4,Ldn,Pen
3,4,Ldn,Pen

对于输入变量的每个组合,都有一个包含该组合的"结果"的文件夹。我想根据输入路由到每个文件夹。我想到使用一个查找. csv文件来匹配输入与输出文件夹,如下所示:

dwelling,wall,weather,occ,folder
5,2,Ldn,Pen,Semi_detached_solid
5,4,Ldn,Pen,Semi_detached_cavity
3,4,Ldn,Pen,Detached_cavity

但是我不知道从哪里开始,注意输入文件需要是动态的,所以我不能只添加另一列的文件夹名称(我不认为无论如何)。
编辑:在输入. csv中有附加列(连续数据),例如:

dwelling,wall,weather,occ,height,temp
5,2,Ldn,Pen,154.7,23.4
5,4,Ldn,Pen,172.4,28.7
3,4,Ldn,Pen,183.5,21,2

这些额外的值需要被路由到输出文件夹,但它们不需要在look_up.csv中(因为匹配只在分类变量上完成)。

qv7cva1a

qv7cva1a1#

有几种方法可以实现这一点,但我也会使用某种Map。
如果您读取一个MapCSV文件,其中包含需要路由的列和目标文件夹,就像您的示例中那样,我将使用dict进行键/值查找(dict非常快)。
逻辑是将需要路由的列转换为键,并使用目标文件夹作为值。
然后迭代实际的CSV,将相关列转换为键,并使用它查找目标文件夹。
我使用了您提供的示例作为下面的输入文件

import csv

def csv_dict_to_key(row: dict) -> str:
    # convert the row values into a key
    return f"{row['dwelling']}_{row['wall']}_{row['weather']}_{row['occ']}"

def create_mapping(filename: str) -> dict:
    # go over the mapping file and return a dict
    # which has the mapping
    result = {}
    with open(filename) as infile:
        reader = csv.DictReader(infile)
        for row in reader:
            key = csv_dict_to_key(row)
            if key in result:
                print(f"FOUND DUPLICATE {key}")
            result[key] = row["folder"]
    return result

mapping = create_mapping("mapping.csv")

with open("data.csv") as infile:
    reader = csv.DictReader(infile)
    for row in reader:
        key = csv_dict_to_key(row)
        if key in mapping:
            # do whatever you need here, I'm just using pring as example
            print(f"----\nROW:    {row}\nKEY:    {key}\nTARGET: {mapping[key]}")
        else:
            print(f"----\nKEY {key} not found in mapping")

输出

----
ROW:    {'dwelling': '5', 'wall': '2', 'weather': 'Ldn', 'occ': 'Pen', 'height': '154.7', 'temp': '23.4'}
KEY:    5_2_Ldn_Pen
TARGET: Semi_detached_solid
----
ROW:    {'dwelling': '5', 'wall': '4', 'weather': 'Ldn', 'occ': 'Pen', 'height': '172.4', 'temp': '28.7'}
KEY:    5_4_Ldn_Pen
TARGET: Semi_detached_cavity
----
ROW:    {'dwelling': '3', 'wall': '4', 'weather': 'Ldn', 'occ': 'Pen', 'height': '183.5', 'temp': '21', None: ['2']}
KEY:    3_4_Ldn_Pen
TARGET: Detached_cavity

相关问题