通过将基本csv文件与另一个新的csv文件合并来重新引导csv文件

时间:2017-05-03 08:57:46

标签: python csv python-2.x

我目前正在使用两个csv文件,base.csv和另一个csv文件,output_20170503.csv将每天生成,因此我的目标是重新定义每个输出,以便它们具有与base.csv相同的数据

我的base.csv:

ID,Name,Number,Shape,Sound
1,John,45,Round,Meow
2,Jimmy,78,Sphere,Woof
3,Marc,,Triangle,Quack
4,Yun,50,Triangle,Meow
5,Nyancat,,Round,Quack

我的输出_20170503.csv

ID,Name,Number,Shape,Sound
1,John,,Round,Meow
2,Jimmy,,Sphere,Woof
3,Marc,,Triangle,Quack
4,Yun,,Triangle,
5,Nyancat,,Round,Quack
6,Marc,,Square,Woof
7,Jonnn,,Hexagon,Chirp

这里的目标是使用output_20170503.csv

从base.csv重新定义数据(ID为1-5)

我想要实现的目标:

ID,Name,Number,Shape,Sound
1,John,45,Round,Meow
2,Jimmy,78,Sphere,Woof
3,Marc,,Triangle,Quack
4,Yun,50,Triangle,Meow
5,Nyancat,,Round,Quack
6,Marc,,Square,Woof
7,Jonnn,,Hexagon,Chirp

我已经搜索了解决方案,但我得到了什么;

  

合并两个csv文件(两个csv文件都有不同的列,对我来说不起作用)

     

从csv文件中删除重复项(使用output_20170503.csv附加base.csv然后删除重复项,因为它们具有不同的列号值而无效)

任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:1)

你可以尝试这个,我使用前两项作为键并生成一个dict,然后迭代new dict更新base dict如果键不在base

new = {"".join(i.split(',')[:2]): i[:-1].split(',') for i in open('output_20170503.csv')}
base = {"".join(i.split(',')[:2]): i[:-1].split(',') for i in open('base.csv')}

base.update({i: new[i] for i in new if i not in base})
f=open("out.csv","w")
for i in sorted(base.values(), key=lambda x: x[0]):
    if i[0]!="ID":
        f.write(",".join(i)+"\n")

输出:

1,John,45,Round,Meow
2,Jimmy,78,Sphere,Woof
3,Marc,,Triangle,Quack
4,Yun,50,Triangle,Meow
5,Nyancat,,Round,Quac
6,Marc,,Square,Woof
7,Jonnn,,Hexagon,Chir

Python2.7 + 支持名为"字典理解的语法扩展"或者" dict comprehension",所以如果你正在使用Python2.6,你需要用以下代码替换前三行:

new = dict(("".join(i.split(',')[:2]),i[:-1].split(',')) for i in open('output_20170503.csv'))
base = dict(("".join(i.split(',')[:2]),i[:-1].split(',')) for i in open('base.csv'))

base.update(dict((i,new[i]) for i in new if i not in base))

答案 1 :(得分:0)

您应该尝试使用非常适合数据操作的pandas库。您可以轻松阅读csv文件并执行merge operation。您的解决方案可能如下所示:

import pandas as pd

base_df = pd.read_csv('base.csv')
output_df = pd.read_csv('My output_20170503.csv')

output_df.update(base_df)

output_df.write_csv('My output_20170503.csv')

output_df上的缺失值现在已使用base_df中的缺失值进行更新。

相关问题