Python合并两个CSV文件

时间:2012-08-29 21:43:05

标签: python

我有两个CSV文件。之一:

s555555,7
s333333,10
s666666,9
s111111,10
s999999,9

还有两个:

s111111,,,,,
s222222,,,,,
s333333,,,,,
s444444,,,,,
s555555,,,,,
s666666,,,,,
s777777,,,,,

我想最终:

[['s111111', '10', '', '', '', ''],
 ['s222222', '',   '', '', '', ''],
 ['s333333', '10', '', '', '', ''],
 ['s444444', '',   '', '', '', ''],
 ['s555555', '7',  '', '', '', ''],
 ['s666666', '9',  '', '', '', ''],
 ['s777777', '',   '', '', '', '']]

这是我的代码:

new_marks = get_marks_from_file('assign1_marks.csv')
marks     = get_marks_from_file('marks.csv')

def merge_marks(all_marks, new_marks, column):
    for n in range(len(new_marks)):
        for a in range(len(all_marks)):
            if all_marks[a][0]==new_marks[n][0]:
                 all_marks[a][column]= new_marks[n][column]

                return marks

我做错了什么?我一直在说:

>>> merge_marks(marks, new_marks, 1)

[['s111111', '',  '', '', '', ''],
 ['s222222', '',  '', '', '', ''],
 ['s333333', '',  '', '', '', ''],
 ['s444444', '',  '', '', '', ''],
 ['s555555', '7', '', '', '', ''],
 ['s666666', '',  '', '', '', ''],
 ['s777777', '',  '', '', '', '']]

1 个答案:

答案 0 :(得分:2)

该行

                return marks

必须以三个级别缩进,才能从for循环和if语句中取出它。现在它返回的是它找到的第一个all_marks[a][0]==new_marks[n][0]匹配,并且永远不会替换其他匹配。

您还想返回all_marks而不是marks:在这种情况下,全局变量marks恰好相同也会更改,但如果您调用它会失败它带有一个名为字面意义的变量。

解决方案是:

def merge_marks(all_marks, new_marks, column):
    for n in range(len(new_marks)):
        for a in range(len(all_marks)):
            if all_marks[a][0]==new_marks[n][0]:
                 all_marks[a][column]= new_marks[n][column]

    return all_marks