【问题标题】:Python | Combine multiple csv (100+) files from one folder taking csv header into consideration蟒蛇 |合并一个文件夹中的多个 csv (100+) 文件,并考虑 csv 标头
【发布时间】:2018-10-11 10:57:57
【问题描述】:

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

  1. 扫描所有 csv 文件(file1.csv、file2.csv ..... filen.csv 等)的输入文件夹并执行以下步骤
  2. 打开第一个 csv 文件 (file1.csv) & 将文件头存储在列表中 & 然后复制 file1.csv 的全部内容 (包括头) & 放入 combine.csv => 然后将 file1.csv 移动到/done 父文件夹下的文件夹
  3. 移至下一个文件 file2.csv => 比较 file2.csv 的标题和第一个文件的标题,以确保它们完全匹配。如果标题匹配,则复制 file2.csv 的内容(不包括标题)并放入 combine.csv => 然后将 file2.csv 移动到父文件夹下的 /done 文件夹。如果 file2.csv 的标头不匹配,则排除合并此文件,将其保留在同一父文件夹中并移动到下一个文件进行合并

我已将示例文件放在链接gdrive folder with sample CSV files 我对任何使用 CSV 或 pandas 的解决方案持开放态度,只要它能满足我的需求

作为一个起点,我最初是在比较标题,如下所示。但是,我不确定如何进一步发展

代码:

    import csv        
    def compare_two_csv_headers(csv_file1, csv_file2):
        with open(csv_file1, newline='') as f:
            reader = csv.reader(f)
            frow1 = next(reader)  # gets the first line
            print(frow1)
        with open(csv_file2, newline='') as f:
            reader = csv.reader(f)
            frow2 = next(reader)  # gets the first line
            print(frow2)
        if frow1==frow2:
            print('Same header')
        else:
            print('Different header')

    csv_file1 = 'D:/2009/cm01JAN2009bhav.csv'
    csv_file2 = 'D:/2009/cm01DEC2009bhav.csv'
    compare_two_csv_headers(csv_file1, csv_file2)

这是第一个 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,

【问题讨论】:

    标签: python pandas csv


    【解决方案1】:

    考虑使用pandas 方法迭代检查列并运行导入,而不是使用csv 扫描第一行。此外,使用os 管理文件名提取和位置,使用shutil 移动done 文件。下面构建了一个数据框列表,用于在循环外进行最终连接。

    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
    

    【讨论】:

    • 完全按照要求工作。将 final_df 导出到 out.csv 后,我看到最后一列的标题显示 Unnamed: 11。这是文件中的列: SYMBOL SERIES OPEN HIGH LOW CLOSE LAST PREVCLOSE TOTTRDQTY TOTTRDVAL TIMESTAMP Unnamed: 11
    • 检查您的数据。您在第一个 csv 文件中有未命名的第 11 列吗?
    • 我在数据中没有看到任何未命名的列。我已将最终的 out.csv 作为 zip 文件上传到 grdive 文件夹中,以备您查看 drive.google.com/open?id=1_1jgRS2IrnHJ_ogHYyVuRzgEnmpuQave
    • 似乎未命名:11 是文件中的标头数。我手动打开了所有 237 个文件并验证没有其他列。我还使用较少数量的文件运行代码 1) 有 1 个文件和 2) 有 4 个文件。每次 out.csv 都有 unnamed:11 即使是随机文件。
    • 我正在使用以下导出 out.csv >>>
    猜你喜欢
    • 2019-10-11
    • 2013-07-19
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多