Python将一个文件夹中的多个csv(100+;)文件合并在一起,同时考虑csv头

Python将一个文件夹中的多个csv(100+;)文件合并在一起,同时考虑csv头,python,pandas,csv,Python,Pandas,Csv,要求:我有一个包含多个csv文件的文件夹。我需要执行以下操作: 扫描输入文件夹中的所有csv文件(file1.csv、file2.csv…..filen.csv等),并执行以下步骤 打开第一个csv文件(file1.csv)并将文件标题存储在列表中,然后复制file1.csv的全部内容(包括标题)并放入combined.csv=>中,然后将file1.csv移动到父文件夹下的/done文件夹中 移动到下一个文件file2.csv=>将file2.csv的头与第一个文件的头进行比较,以确保它们完全

要求:我有一个包含多个csv文件的文件夹。我需要执行以下操作:

  • 扫描输入文件夹中的所有csv文件(file1.csv、file2.csv…..filen.csv等),并执行以下步骤
  • 打开第一个csv文件(file1.csv)并将文件标题存储在列表中,然后复制file1.csv的全部内容(包括标题)并放入combined.csv=>中,然后将file1.csv移动到父文件夹下的/done文件夹中
  • 移动到下一个文件file2.csv=>将file2.csv的头与第一个文件的头进行比较,以确保它们完全匹配。如果标题匹配,则复制file2.csv的内容(不包括标题)&放入combined.csv=>中,然后将file2.csv移动到父文件夹下的/done文件夹中。如果file2.csv的标题不匹配,则排除合并此文件,将其保留在同一父文件夹中,并移动到下一个文件进行合并
  • 我已将示例文件放置在链接上 我愿意接受CSV或pandas的任何解决方案,只要它符合我的要求

    作为起点,我最初的工作是比较标题,如下所示。然而,我不确定如何进一步行动

    代码:

    下面是第一个csv文件的前10行

    SYMBOL,SERIES,OPEN,HIGH,LOW,CLOSE,LAST,PREVCLOSE,TOTTRDQTY,TOTTRDVAL,TIMESTAMP,
    20MICRONS,EQ,46.5,47,45.7,46.05,46,46.55,7092,328975.25,31-DEC-2009,
    3IINFOTECH,EQ,85.8,86.7,84.5,85.15,85.35,85.05,2423812,207760480.3,31-DEC-2009,
    3MINDIA,EQ,1855.05,1879.9,1855.05,1865.75,1874.95,1850.45,85,158679.1,31-DEC-2009,
    AARTIDRUGS,EQ,107.4,108.75,103.65,104.45,104.9,106.05,84012,8929759.4,31-DEC-2009,
    AARTIIND,EQ,51,51.9,48.9,49.2,49.1,50.45,149365,7517110.3,31-DEC-2009,
    AARVEEDEN,EQ,64,64.5,63.05,63.85,63.1,62.7,2172,138651.5,31-DEC-2009,
    ABAN,EQ,1265,1297,1265,1283.65,1283.2,1260.05,1381290,1773221519.75,31-DEC-2009,
    ABB,EQ,756.2,770.85,756.2,767.1,769.55,756.3,292376,223660807.4,31-DEC-2009,
    ABCIL,EQ,85.4,89,84.9,86.85,86.95,84.7,59183,5170993.2,31-DEC-2009,
    

    考虑使用
    csv
    方法反复检查列并运行导入,而不是使用
    csv
    扫描第一行。另外,使用
    os
    管理文件名提取和位置,使用
    shutil
    移动已完成的文件。下面构建了循环外部最终连接的数据帧列表

    import os, shutil
    import pandas as pd
    
    def import_csvs(csv_file):
    
        path = r'/path/to/csv/files'
        csv_files = sorted([f for f in os.listdir(path) if f[-3:] == 'csv'])
    
        # INITIALIZE DATAFRAME LIST
        df_list = []
        # READ FIRST DF (ASSUMED FIRST IN ALPHABETICAL ORDER)
        first_df = pd.read_csv(os.path.join(path, csv_files[0]))
        # APPEND FIRST DF   
        df_list.append(first_df)
    
        # MOVE FIRST CSV
        shutil.move(os.path.join(path, csv_files[0]), os.path.join(path,'done',csv_files[0]))
    
        # LOOP ALL OTHER CSVs SKIPPING FIRST
        for f in csv_files[1:]:                 
           # IMPORT CSV
           tmp = pd.read_csv(os.path.join(path, f))
    
           # CHECK DF COLUMNS EXACTLY MATCH
           if list(tmp.columns) == list(first_df.columns):  
              # APPEND DF TO LIST
              df_list.append(tmp)
    
              # MOVE COMPLETED FILE
              shutil.move(os.path.join(path, f), os.path.join(path, 'done', f))
    
        final_df = pd.concat(df_list)
    
        return final_df
    

    工作完全符合要求。将最终的_df导出到out.csv后,我看到最后一列的标题为Unnamed:11。以下是文件中的密码:SYMBOL SERIES OPEN HIGH LOW CLOSE LAST PREVCLOSE ToTrdQty ToTrdVal时间戳未命名:11检查数据。在第一个csv文件中是否有未命名的第11列?我在数据中没有看到任何未命名的列。我已将final out.csv作为zip文件上传到grdive文件夹中,以防您想查看它。它似乎未命名:11是文件中的页眉数。我手动打开了所有237个文件,并确认没有其他列。我还使用较少的文件运行代码1)使用1个文件,2)使用4个文件。每次out.csv都有未命名的:11,即使是随机文件。我正在使用以下命令导出out.csv>
    import os, shutil
    import pandas as pd
    
    def import_csvs(csv_file):
    
        path = r'/path/to/csv/files'
        csv_files = sorted([f for f in os.listdir(path) if f[-3:] == 'csv'])
    
        # INITIALIZE DATAFRAME LIST
        df_list = []
        # READ FIRST DF (ASSUMED FIRST IN ALPHABETICAL ORDER)
        first_df = pd.read_csv(os.path.join(path, csv_files[0]))
        # APPEND FIRST DF   
        df_list.append(first_df)
    
        # MOVE FIRST CSV
        shutil.move(os.path.join(path, csv_files[0]), os.path.join(path,'done',csv_files[0]))
    
        # LOOP ALL OTHER CSVs SKIPPING FIRST
        for f in csv_files[1:]:                 
           # IMPORT CSV
           tmp = pd.read_csv(os.path.join(path, f))
    
           # CHECK DF COLUMNS EXACTLY MATCH
           if list(tmp.columns) == list(first_df.columns):  
              # APPEND DF TO LIST
              df_list.append(tmp)
    
              # MOVE COMPLETED FILE
              shutil.move(os.path.join(path, f), os.path.join(path, 'done', f))
    
        final_df = pd.concat(df_list)
    
        return final_df