如何在python中将数据从一个csv复制到另一个csv?

时间:2017-03-31 08:43:41

标签: python csv pandas

我有两个CSV文件,一个包含某些列和行,第二个只有一行包含标题,第二个文件中的标题包含的标题多于第一个,但包含第一个文件中的所有标题。 我想在匹配第一个文件的标题时填充第二个文件中的列。 第一个文件是一个原始数据文件,它有20列,100,000行需要复制到具有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")

2 个答案:

答案 0 :(得分:1)

考虑数据框abcxyz

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: []
abc.append(xyz)[abc.columns.tolist()]

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

然后您可以导出到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

答案 1 :(得分:0)

pandas是一个很棒的工具,但这里有点过分。 csv模块已足够,DictReaderDictWriter可以自动执行您需要的操作:

假设:

  • 输入:

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

    • 输出文件使用来自输入文件的数据填充字段名称

可能的代码:

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)

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