如何根据列名将多个csv文件连接为一个,而不必在代码中键入每个列标题

时间:2018-10-29 10:43:34

标签: python csv merge

我是python的新手(大约一个星期的经验),我似乎找不到解决问题的答案。

我试图将基于文件夹数据的数百个csv文件合并为基于列名的单个csv文件。

我找到的解决方案要求我输入每个文件名或列标题,这将需要几天的时间。

我使用此代码创建了一个csv文件,但列名四处移动,因此数据不在整个DataFrame的同一列中:

import pandas as pd
import glob
import os
def concatenate(indir=r"C:\\Users\ge\Documents\d\de", 
outfile = r"C:\Users\ge\Documents\d"):
    os.chdir(indir)
    fileList=glob.glob("*.csv")
    dfList = []
    for filename in fileList:
        print(filename)
        df = pd.read_csv(filename, header = None)
        dfList.append(df)
        concatDf = pd.concat(dfList, axis = 0)
    concatDf.to_csv(outfile, index= None)

是否有快速解雇方法来执行此操作,因为我不到一周就可以对数据集进行统计。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

这是一种高效的内存存储方式。

from pathlib import Path
import csv

indir = Path(r'C:\\Users\gerardchurch\Documents\Data\dev_en')
outfile = Path(r"C:\\Users\gerardchurch\Documents\Data\output.csv")


def find_header_from_all_files(indir):
    columns = set()
    print("Looking for column names in", indir)
    for f in indir.glob('*.csv'):
        with f.open() as sample_csv:
            sample_reader = csv.DictReader(sample_csv)
            try:
                first_row = next(sample_reader)
            except StopIteration:
                print("File {} doesn't contain any data. Double check this".format(f))
                continue
            else:
                columns.update(first_row.keys())
    return columns


columns = find_header_from_all_files(indir)
print("The columns are:", sorted(columns))

with outfile.open('w') as outf:
    wr = csv.DictWriter(outf, fieldnames=list(columns))
    wr.writeheader()
    for inpath in indir.glob('*.csv'):
        print("Parsing", inpath)
        with inpath.open() as infile:
            reader = csv.DictReader(infile)
            wr.writerows(reader)
print("Done, find the output at", outfile)

当输入的csv之一不包含所有columns

时,这应该可以解决这种情况

答案 1 :(得分:0)

我不确定我是否正确理解了您的问题,但这是您可以在不提供任何列名的情况下合并文件的方法之一:

import pandas as pd
import glob
import os


def concatenate(indir):
    os.chdir(indir)
    fileList=glob.glob("*.csv")
    output_file = pd.concat([pd.read_csv(filename) for filename in fileList])
    output_file.to_csv("_output.csv", index=False)


concatenate(indir= r"C:\\Users\gerardchurch\Documents\Data\dev_en")