合并python中两个'.CSV'文件的记录

时间:2014-12-10 07:18:28

标签: python csv

我有以下格式的两个'.csv'文件: 第一档:

Roll_num Class_Name
1         ABC
2         DEF
5         PQR
27        UVW

第二档:

Roll_num Marks Grade
1        75    A
2        60    C
27       68    B
61       45    E

现在我想在第二个文件中添加一个列,在第一个文件中附加一个“Class_Name”列。两个文件中的数据都包含重复项,未进行排序。

我编写了以下代码,将2个文件中所需的数据写入新文件。

import csv

path="xyz"
file_read=open(path + "ClassName.CSV", "r")
reader_ClassName = csv.reader(file_read)

read_all_data=open(path + "Student.CSV", "r")
reader_Student =csv.reader(read_all_data)
write_all_data=open( path +"Student_Classname.CSV", "w")

for line_Student in reader_Student:
        Roll_Student=line_Student[0]
        for line_ClassName in reader_ClassName:
            Roll_ClassName=line_ClassName[0]
            ClassName=line_ClassName[1]         
            if(Roll_ClassName == Roll_Student):
                string= Roll_Student +","+ClassName  +"\n"
                print string
                write_all_data.write(string)
                break  

预期输出:

Roll_num Marks Grade Class_Name
1        75    A     ABC
2        60    C     DEF
27       68    B     UVW
61       45    E     LMN

输出我们的代码生成:

   Roll_num Marks Grade Class_Name
    1        75    A     ABC
    2        60    C     DEF

从第二内部'for'循环中读取第三行存在一些问题。 我们在这两个文件中都有数十万条记录。

2 个答案:

答案 0 :(得分:1)

我建议通过阅读整个ClassName.csv文件并首先放入字典来避免loop in loop。我建议下面的想法

mydict = {}
for each_line in ClassName_csvfile:
     rollnum = get_roll_num()
     classname = get_class_name()
     mydict[rollnum]=classname 

for each_line in Student_csv_file:
     rollnum = get_roll_num()
     mark = get_mark()
     grade = get_grade()
     Classname = ''
     if mydict.has_key(rollnum):
        Classname = mydict[rollnum]
     writetofile(rollnum, mark, grade, Classname)

更新:如果您使用if rollnum in mydict:,则可以使用mydict.has_key(rollnum)代替Python 2.3+。我正在使用python 2.7并且都工作

P / s:很抱歉没有评论,因为它需要我50个声誉

答案 1 :(得分:0)

我已将第一个CSV文件命名为hash.csv,将第二个CSV文件命名为data.csv。下面的脚本将帮助您。

import re

# Building up a hash with roll_num and class_name from hash.csv
chash = dict([ re.split('\s+', x.strip()) for x in open('hash.csv').readlines()][1:])

# Building a list of students record from data.csv
data = [ re.split('\s+', x.strip()) for x in open('data.csv').readlines() ][1:]

# Iterating through each data
for x in data:
    if x[0] in chash:
        x.append(chash[x[0]])
        print('{0:<5} {1:<5} {2:<5} {3:<5}'.format(*x))
    else:
        print('{0:<5} {1:<5} {2:<5}'.format(*x))

输出:

1     75    A  ABC
2     60    C  DEF
27    68    B  UVW
61    45    E