如何在python中的一个文件中选择然后组合类似的csv文件?

时间:2019-09-11 07:34:30

标签: python

我的文件夹中有不同的CSV文件。

例如:

Master_data_0112207518.csv       3MB
Master_data_0112272018.csv       2MB
Master_data_0112232018.csv       7MB
Master_data_Loop_0110452018.csv  5MB
Master_data_Loop_0110222018.csv  7MB
Master_data_Loop_0110372018.csv  6MB

我必须编写python代码以选择相同的文件开头名称,并在一个csv文件中创建此数据组的合并文件。

输出:

Total Number of different files : 2

    ['Master_data.csv', 'Master_data_Loop.csv']

组合后:

Master_data.csv       12MB
Master_data_Loop.csv  18MB

1 个答案:

答案 0 :(得分:0)

好的,所以第一步是获取文件名列表,并按其模式分组。如果您所有文件的后缀始终以数字结尾,则可以使用

import glob
import re
from itertools import groupby

all_csv = glob.glob('*.csv')
all_csv.sort()

split_csv = [list(i) for j, i in groupby(all_csv, lambda a: re.split(r'\d*.csv$', a)[0])]

正则表达式用于拆分文件名,删除结尾数字和扩展名,因此只剩下文件名中几个CSV通用的部分。它允许我们使用 itertools goupby 功能。 split_csv应该如下所示:

[['Master_data_0112207518.csv', 'Master_data_0112232018.csv', 'Master_data_0112272018.csv'], ['Master_data_Loop_0110222018.csv', 'Master_data_Loop_0110372018.csv', 'Master_data_Loop_0110452018.csv']]

之后,您有两种解决方案来合并csv文件。最简单的一种使用熊猫库:

import pandas

for patern in split_csv:
    combined_csv = pandas.concat([pandas.read_csv(f) for f in patern])
    combined_csv.to_csv('{}_combined.csv'.format(re.split(r'\d*.csv$', patern[0])[0]), index=False)

另一个适应性较差,特别是如果您没有相同的列或顺序不一样,但是不需要任何其他库的话:

for patern in split_csv:
    ficout = open('{}_combined.csv'.format(re.split(r'\d*.csv$', patern[0])[0]), 'a')
    for ficin in patern:
        f = open(ficin)
        f.__next__() # It's use to skip the header line...
        for line in f:
            ficout.write(line)
        f.close()
    ficout.close()