【问题标题】:Search CSV from subdirectory and add folder name as a column从子目录中搜索 CSV 并将文件夹名称添加为列
【发布时间】:2021-07-24 19:17:43
【问题描述】:

我想从我的工作目录的不同子目录中读取 csv,以创建一个组合的 csv 文件。组合后的 csv 应该有一列包含从中读取特定 csv 的子目录名称。

这是我尝试过的。

import os
import glob
import pandas as pd

all_filenames = [i for i in glob.glob('*/*.csv'),recursive=True)]
list_subfolder = [f.name for f in os.scandir(ride_path) if f.is_dir()]

df_list = []

for i in range(len(all_filenames)):
    dir_name = list_subfolder[i]
    current_csv = all_filenames[i]
    data = pd.read_csv(current_csv)
    data["sub_folder"]= dir_name
    df_list.append(data)

combined_df = pd.concat(df_list)
combined_df.to_csv("combined_csv.csv", index=False)

问题在于,它添加了其中没有 csvs' 的子目录,这是错误且有问题的。实现这一目标的最佳方式是什么。

【问题讨论】:

  • 我想你想要glob.glob('**/*.csv', recursive=True)
  • 可行,但主要问题是获取从其中读取 csv 的文件夹名称作为列

标签: python pandas dataframe csv glob


【解决方案1】:

您可以通过pathlib 模块进行此操作:

from pathlib import Path

inp_path =  Path('.') # specify the inp path. Here, ('.') means current working dir
df_list= []

for csv_file in inp_path.glob('**/*.csv'): # glob here will return generator obj which will yield csv file one by one
    df = pd.read_csv(csv_file)
    df['file_name'] = csv_file.parent # possible to get parent dir via pathlib
    df_list.append(df_list)


combined_df = pd.concat(df_list)
combined_df.to_csv("combined_csv.csv", index=False)

Note.

1- 如果您只需要名称,请使用csv_file.parent.name

2- 如果您想要父目录的完整路径,请使用csv_file.parent.absolute()

【讨论】:

    【解决方案2】:

    globos 的另一个选项:

    import os
    import glob
    import pandas as pd
    
    df_list = []
    
    for csv in glob.glob('**/*.csv', recursive=True):
        parent_folder = os.path.split(os.path.dirname(csv))[-1]
        df = pd.read_csv(csv)
        df['subfolder'] = parent_folder
        df_list.append(df)
    
    combined_df = pd.concat(df_list)
    combined_df.to_csv("combined_csv.csv", index=False)
    

    【讨论】:

      【解决方案3】:

      您可以使用我们os.path.split():

      import os
      import glob
      import pandas as pd
      
      all_filenames = [i for i in glob.glob("**/*.csv", recursive=True)]
      
      df_list = []
      for f in all_filenames:
          current_csv = f
          data = pd.read_csv(current_csv)
          data["sub_folder"] = os.path.split(f)[0]    # <-- [0] is directory [1] is filename
          df_list.append(data)
      
      combined_df = pd.concat(df_list)
      print(combined_df)
      combined_df.to_csv("combined_csv.csv", index=False)
      

      【讨论】:

        【解决方案4】:

        单行法(改编自@nk03 答案)。

        import pandas as pd
        import pathlib as pth
        
        pd.concat([pd.read_csv(csvfile).assign(file_name=csvfile.parent)
                   for csvfile in pth.Path(".").glob("**/*.csv")]) \
          .to_csv("combined_csv.csv", index=False)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-13
          • 2017-08-17
          • 1970-01-01
          • 2020-11-10
          • 1970-01-01
          • 1970-01-01
          • 2019-03-25
          相关资源
          最近更新 更多