【问题标题】:merging all csv files into one big csv file per folder using pandas使用 pandas 将所有 csv 文件合并为每个文件夹的一个大 csv 文件
【发布时间】:2020-11-23 12:33:34
【问题描述】:

我有一个包含多个子目录和子子目录的目录。 我的目标是读取所有 csv 文件并将它们附加到每个子目录一个大 csv 文件中(PS 不是每个子子目录一个大 csv 文件,而是每个子目录一个文件)。

以下是我用来将所有 csv 文件附加到 1 个大 csv 文件中的代码,但此代码的唯一问题是 最终的 csv 文件大约为 ~890 MB,这使得它当您尝试在 Microsoft Excel 中打开文件时无法读取,因为它遇到“内存问题”。

dirName = 'FTP_Data/2019/'

allFilesList = list()
print('[info.] looking for .csv files.')
for (dirpath, dirnames, filenames) in os.walk(dirName):
    for file in filenames:
        if file.endswith('.csv'):
            allFilesList += [os.path.join(dirpath, file).replace('\\','/')]

print('[info.] combining all the .csv files.')
combined_csv = pd.concat([pd.read_csv(file, sort=True) for file in allFilesList])
print('[info.] exporitng to one final output file.')
combined_csv.to_csv('FinalOutputFrom2019.csv', index=False, encoding='utf-8')

以上代码生成一个名为“FinalOutputFrom2019.csv”的大 csv 文件。

现在如果目录结构如下,我希望它每月生成 12 个文件 - 2019-01.csv,2019-02.csv,2019-03.csv,2019-04.csv,2019-05.csv,2019-06.csv,@987654328 @,2019-08.csv,2019-09.csv,2019-10.csv,2019-11.csv,2019-12.csv

FTP_data
|-- 2019
    |-- 2019-01
        |-- 2019-01-01
            |-- foo.csv
            |-- bar.csv
            |-- foobar.xml
        |-- 2019-01-03
            |-- foobar.csv
        |-- ...
    |-- 2019-02
        |-- 2019-02-02
            |-- ...
        |-- 2019-02-03
            |-- ...
        |-- 2019-02-05
            |-- ...
    |-- ...

【问题讨论】:

  • 你在循环2019-012019-12时遇到了什么困难?
  • @BillHuang 没有任何困难。创建的最终文件非常大,以至于在 Microsoft Excel 中打开它变得不切实际。它遇到“内存问题”,因为最终文件的大小约为 800+ MB

标签: python pandas csv


【解决方案1】:

只需将您的工作 sn-p 调整为贯穿所有月份的 for 循环。试试这个:

设置

yr = 2019
dirName = f'FTP_Data/{yr}/'

def export_csv(dirName, csv_name):
    allFilesList = list()
    print('[info.] looking for .csv files.')
    for dirpath, dirnames, filenames in os.walk(dirName):
        for file in filenames:
            if file.endswith('.csv'):
                allFilesList.append(os.path.join(dirpath, file).replace('\\', '/'))

    print('[info.] combining all the .csv files.')
    combined_csv = pd.concat([pd.read_csv(file, sort=True) for file in allFilesList])
    print('[info.] exporting to one final output file.')
    combined_csv.to_csv(f'{csv_name}.csv', index=False, encoding='utf-8')

执行

for mon in range(1, 13):
    # yr = dirName.split("/")[1]
    csv_name = f"{yr}-{mon:02}"
    subdirName = f"{dirName}{csv_name}"
    export_csv(subdirName, csv_name)

【讨论】:

    【解决方案2】:
    import os
    import pandas as pd
    
    
    dirName = 'FTP_Data/2019/2019-'
    Months = ('01', '02', '03', '04', '05', '06','07', '08', '09', '10', '11', '12')
    # months are hard coded but if you prefer you can loop too.
    
    Monthly_dirNames = []
    i = 0
    for mn in Months:
        path = dirName+mn
    
        #Get the list of csv files in each Sub directory:
        Monthly_Csv_Files = [f for f in os.listdir(path) if f.endswith('.csv')]
    
        #*Optional* Show the csv files to be merged to the user
        print(f'CSV files for month_{mn} are :', Monthly_Csv_Files)
    
        # Read and concat all csv files in that sub directory to a Data Frame:
        combined_csv = pd.concat([pd.read_csv(path+'/'+file) for file in Monthly_Csv_Files])
    
        # Write Combined Data Frame as a csv file in that subfolder:
        # Removing 'path+' from below will write all csv files to .py's directory:
        combined_csv.to_csv(path+f'/Monthly_Output_From_2019_{mn}.csv', index=False, encoding='utf-8')
        i += 1
    

    【讨论】:

    • @aman-singh 在我上面的代码中我没有将 sort=True 添加到 pd.read_csv(file, sort=True) ,它似乎是 sort=True 属于 pd.concat 而不是 pd.read_csv 方法。你确定你的第一个代码你也没有得到参数错误?
    猜你喜欢
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2014-05-17
    • 1970-01-01
    相关资源
    最近更新 更多