如何组合csv文件并使用python添加标题行?

时间:2016-12-30 02:53:49

标签: python csv

我有来自St.Louis Fred的50个csv价格指数数据文件,每个文件的格式如下:

enter image description here

我想组合多个csv文件并向其添加一行标题以实现以下格式:

enter image description here

所以我可以将数据存储在一个csv文件中,我可以知道有什么办法可以用Python做到吗?

3 个答案:

答案 0 :(得分:3)

重复DATE列并不合理。除非有某些特定目的。此外,在合并时,您需要注意特定行上的数据属于同一日期。

如果您使用 DATE 作为索引合并并使用 OUTER 方法合并,则最好使用pandas。因此,同一天的值在同一行。

import pandas as pd;

df1 = pd.read_table('file1.csv', sep=',')
df2 = pd.read_table('file2.csv', sep=',')
df3 = pd.read_table('file3.csv', sep=',')

因此,基本上将您拥有的所有文件作为数据框加载。然后使用mergereduce函数合并文件。

data_frames = [df1, df2, df3]

您可以在上面的代码中添加任意数量的数据框。

然后合并它们。要保留属于同一日期的值,您需要将其合并到DATE

df_merged = reduce(lambda  left,right: pd.merge(left,right,on=['DATE'],
                                            how='outer'), data_frames)

然后将合并的数据写入csv文件。

pd.DataFrame.to_csv(df_merged, 'merged.txt', sep=',', na_rep='.', index=False)

这应该给你

DATE VALUE1 VALUE2 VALUE3 ....

答案 1 :(得分:1)

Pandas是一个很好的解决方案,但是如果你想要一个python std lib解决方案:

Sub MAIN()
    Dim i As Long
    For i = 3 To Sheets.Count
        Sheets(i).Activate
        Call dural
    Next i
End Sub

答案 2 :(得分:1)

这将垂直连接所提供目录中的所有文件(因此您不必在代码中指定它们)。这些文件可以包含任意数量的列,并且可以处理值中的空格。但是,文件必须具有相同的行数。

它仅使用模块csv和os。

import os
import csv

dir_base = r'H:\apps\xp\Desktop\localrepo\Temp'
dir_name = '-test2'
output_name = 'output.csv'

path = os.path.join(dir_base, dir_name)
out_path = os.path.join(dir_base, output_name)


def _extend(lines, lineno, line):
    try:
        lines[lineno].extend(line)
    except IndexError:
        lines.append(line)


def main():
    lines = []

    # read and generate new file
    for root, dirs, files in os.walk(path):
        for f in files:
            with open(os.path.join(root, f), 'r') as csvfile:
                f_in = csv.reader(csvfile)
                for lineno, line in enumerate(f_in, start=1):
                    if lineno == 1:
                        header = [''] * len(line)
                        header[0] = f
                        _extend(lines, 0, header)
                    _extend(lines, lineno, line)

    # print new file
    with open(out_path, 'w', newline='\n') as csvfile:
        csv.writer(csvfile).writerows(lines)


if __name__ == '__main__':
    main()

输出如下: enter image description here

如果你的" csv"文件有其他分隔符(因此在技术上不是" c" sv文件),只需更改代码csv.reader(csvfile)的这一部分以指示分隔符,例如csv.reader(csvfile, delimiter='|')

希望它有所帮助!