在python中,如何根据头名称将数据从一个csv复制到另一个csv?

在python中,如何根据头名称将数据从一个csv复制到另一个csv?,python,csv,pandas,Python,Csv,Pandas,我有两个CSV文件,一个有特定的列和行,第二个只有一行有标题,第二个文件中的标题比第一个文件中的标题多,但包括第一个文件中的所有标题。 当第二个文件与第一个文件的头匹配时,我想填充第二个文件中的列。 第一个文件是原始数据文件,它有20列100000行,需要复制到有30列的工作文件中(20列与原始数据相同)。除列标题外,工作文件中也没有数据。 我可以用下面的代码复制数据,但它会更改列的顺序。我希望工作文件中的列顺序保持不变。 我对这门语言还很陌生,我真的很感激任何帮助 我现在使用的代码是: imp

我有两个CSV文件,一个有特定的列和行,第二个只有一行有标题,第二个文件中的标题比第一个文件中的标题多,但包括第一个文件中的所有标题。 当第二个文件与第一个文件的头匹配时,我想填充第二个文件中的列。 第一个文件是原始数据文件,它有20列100000行,需要复制到有30列的工作文件中(20列与原始数据相同)。除列标题外,工作文件中也没有数据。 我可以用下面的代码复制数据,但它会更改列的顺序。我希望工作文件中的列顺序保持不变。 我对这门语言还很陌生,我真的很感激任何帮助

我现在使用的代码是:

import os
import glob
import pandas as pd
def concatenate(indir = "", outfile = "",outdf=""):
    os.chdir(indir)
    fileList=glob.glob("*.csv")
    dfList=[]
    for fileName in fileList:
        print(fileName)
        df=pd.read_csv(fileName,low_memory=False)
        dfList.append(df)
    concatdf=pd.concat(dfList, axis=0)
    concatdf.to_csv(outfile, index=False)
concatenate(indir = "xyz.csv", outfile = "abc.csv")

考虑数据帧
abc
xyz

xyz = pd.DataFrame(dict(a=[1, 2, 3], b=[1, 2, 3], c=[1, 2, 3], d=[1, 2, 3]))
abc = pd.DataFrame(columns=list('artbnckld'))

xyz

   a  b  c  d
0  1  1  1  1
1  2  2  2  2
2  3  3  3  3

abc 

Empty DataFrame
Columns: [a, r, t, b, n, c, k, l, d]
Index: []

然后可以导出到csv文件

abc.append(xyz)[abc.columns.tolist()].to_csv()

,a,r,t,b,n,c,k,l,d
0,1.0,,,1.0,,1.0,,,1.0
1,2.0,,,2.0,,2.0,,,2.0
2,3.0,,,3.0,,3.0,,,3.0

熊猫是一种很好的工具,但在这里它的杀伤力太大了。csv模块就足够了,
DictReader
DictWriter
自动执行您需要的操作:

假设:

  • 投入:

    • 输出文件模板最初在其第一行中包含标题
    • 您希望处理包含输出文件标题子集的输入文件列表
  • 输出:

    • 输出文件由输入文件中与字段名有关的数据填充
可能代码:

def populate(outfile, infilelist)
    # First of all read output file field names:
    with open(outfile) as fd:
        rd = csv.DictReader(fd)
        names = rd.fieldnames

    # Reopen output file in append mode to populate if from the files of infilelist
    with open(outfile, "a") as fdout:
        wr = csvDictWriter(fdout, fieldnames = names)
        # loop over the input files:
        for filename in infilelist:
            with open(filename) as fd:
                rd = csv.DictReader(fd)
                # simply copy the rows, one at a time
                for row in rd:
                    wr.writerow(row)

此算法允许添加数据,即使输出文件包含的数据超过标题行,并且可以处理大量数据,因为(除了文件缓冲区)内存中只保留一行。

我很难理解您的问题。你能发布两个文件的内容和你想要的结果吗?我不知道我是否可以用office报告发布,但让我试着让它更清楚一点。我有两个文件,一个是带有特定列和值的原始数据,它有数字值和字母名称,另一个是我的工作文件,我将用这些原始数据进行所有分类。它只有标题。工作文件的头包含原始数据的所有头,我们必须手动从原始数据复制这些头。我想通过python复制这些值,同时保持工作文件中的列顺序。我有20多列和100000行,我可以写列,但不能键入值。请耐心听我说,因为我还在学习这门语言。谢谢你的帮助,我能够运行代码,它运行时没有任何错误,但它没有做任何事情。@AnkitSati:如果它没有达到预期效果,只需为以下内容添加跟踪打印:
outfile
infielist
,然后在循环中找到了
filename
。我没有您的文件夹;-)只有两个文件原始数据一个工作文件,工作文件被导出在您只有一个文件的情况下,为什么在一个文件夹中的所有csv文件上显示代码循环?对不起,这是为了预防万一我有多个文件,但结果是一个延伸。只有一个文件。我只需要在匹配列后将数据从原始复制到工作。
def populate(outfile, infilelist)
    # First of all read output file field names:
    with open(outfile) as fd:
        rd = csv.DictReader(fd)
        names = rd.fieldnames

    # Reopen output file in append mode to populate if from the files of infilelist
    with open(outfile, "a") as fdout:
        wr = csvDictWriter(fdout, fieldnames = names)
        # loop over the input files:
        for filename in infilelist:
            with open(filename) as fd:
                rd = csv.DictReader(fd)
                # simply copy the rows, one at a time
                for row in rd:
                    wr.writerow(row)