专题4:按车辆ID筛选后将不同文件夹下相同名称的csv文件进行合并

一.前景概述

我们在专题1中将NGSIM数据集切割成11个小部分,如图1所示。

  • 专题2回顾

在专题2中按照路段类型不同分为:“i-80”、“lankershim”、“Peachtree”、“us-101”四种路段类型,并根据路段不同将NGSIM数据集做了初步筛选,以“i-80”路段为例,如图2所示为该路段下的数据集。
当我们打开一个csv文件后会发现数据存储是没有规律可循的。如图3所示,csv文件中包含了不同车辆ID的字段,且顺序排列并不规律。所以我们需要将同一车辆ID的字段提取出来进行分类存储。

  • 专题3回顾

在专题3中我们按照车辆ID的不同,对各个路段下的数据集按照车辆ID不同进行了分类。以“i-80”路段为例,图4中的文件夹分别对应了图2中的csv文件,对每个csv文件按照车辆ID的不同对字段进行提取和存储,如图5所示为按车辆ID不同分类好的数据集,每个csv文件的名称就代表了车辆ID。

  • 专题4的工作
    专题4的工作就是将不同文件夹中相同车辆ID的csv文件进行合并,最终达到如图6所示的结果,每一csv文件的文件名就代表了相对应的车辆ID。图7为车辆ID为1的示例。
    NGSIM数据集切割
    按照路段类型切分-以“i-80”路段为例
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

二.代码编辑过程

本部分采用Python作为编程工具,使用面向对象进行代码编译。

1.创建用于获取csv文件的类

  • 代码展示1
    def Exist_List(self,path_exist):
        """
        获取目标路径下的文件夹或文件
        :param path_exist: 目标路径
        :return:
        """
        object_list = os.listdir(path_exist)
        return object_list

该方法用以获取目标路径下由文件和文件夹组成的列表。主要用“os.listdir()”来实现的。

  • 代码展示2
 def Exist_Dict(self,path_exist,object_dict):
        """
        :param path_exist:
        :param object_dict:
        :return:
        """
        for sub_object in self.Exist_List(path_exist):
            object_path = f"{path_exist}\\{sub_object}"
            sub_object_list = os.listdir(object_path)
            object_dict[sub_object] = sub_object_list

该方法对获取的含有文件和文件夹的列表进行遍历,并获取主路径对应的子级路径下的文件和文件夹。

  • 代码展示3
     def Csv_Dict(self):
        """
        存储csv文件的字典
        :return:
        """
        for folder in self.Folder_List(self.path):
            folder_path = f"{self.path}\\{folder}"
            self.Exist_Dict(folder_path,self.csv_dict)
        return self.csv_dict  # 返回存储csv文件的字典

该方法使用以将读取的csv文件进行存储(以字典的形式存储)。

2.创建用于合并csv文件的类

  • 代码展示1
 def Select_Csv_Name(self,csv_name_set):
        """
        筛选csv文件名
        :param csv_name_set:
        :return:
        """
        for sub_folder,csv_list in self.Csv_dict().items():  # 遍历存放csv文件的字典
            for csv in csv_list:
                csv_name_tuple = os.path.splitext(csv)  # 包含csv文件名和扩展名的元组
                csv_name_list = list(csv_name_tuple)  # 数据类型转换:元组转列表
                csv_name_set.add(csv_name_list[0])

该方法是用以将获取的csv文件的文件名和扩展名做分离处理,并提取文件名。

  • 代码展示2
    def Save_Csv_Name(self,csv_name_dict):
        """
        将csv文件名以键值对的形式存储在相对应的字典中
        :param csv_name_dict:
        :return:
        """
        for folder in self.Folder_list():
            csv_name_set = set()  # 空集合
            self.Select_Csv_Name(csv_name_set)
            csv_name_list = list(csv_name_set)  # 将集合转换成列表
            csv_name_list.sort(reverse=False)  # 升序排序
            csv_name_dict[folder ] = csv_name_list
        return csv_name_dict

将csv文件的文件名以键值对的形式存储在相对应的字典中。

  • 代码展示3
在这里插入代码    def Create_Folder(self,path):
        """
        创建文件夹
        :param path: 创建路径
        :return:
        """
        isExists = os.path.exists(path)  # 判断路径是否存在
        try:
            if not isExists:  # 如果路径不存在
                os.makedirs(path)
            else:
                pass
        except FileExistsError:  # 异常判断
            print("文件夹已存在")

该部分代码用以创建文件夹。

  • 代码展示4
    def Delect_Folder(self,path_folder):
        """
        删除文件夹
        :param path_folder:目标文件夹路径
        :return:
        """
        name_list = os.listdir(path_folder)  # 获取目标文件夹下所有的文件夹和文件,并存放在列表中
        for name in name_list:  # 遍历存放文件夹和文件的列表
            sub_path = f"{path_folder}\\{name}"
            if os.path.isfile(sub_path):  # 如果判断路径为文件,则跳出当前循环,并执行下一次循环
                if os.path.getsize(sub_path) == 0:  # 如果文件为空文件
                    os.remove(sub_path)  # 删除空文件
                else:
                    continue  # 否则退出循环,进入下一个循环

            if os.path.isdir(sub_path):  # 判断是否为目录
                if not os.listdir(sub_path):  # 如果为空目录
                    os.rmdir(sub_path)  # 删除空目录或空文件
                else:
                    continue  # 否则退出循环,进入下一个循环

该部分代码是用以删除空文件夹。

三.总结

本部分是对专题3中删选的数据集做了合并处理,从而使得同一个车辆ID的字段能够存储在一个csv文件中。文件合并结果如图8所示。关于NGSIM数据集的详细处理可以参考《NGSIM数据处理程序(跟驰车辆)》;NGSIM数据集可以从《NGSIM数据集》获取。
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小谢@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值