繁体   English   中英

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

[英]Merging records from two '.CSV' files in python

我有以下两种格式的'.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”循环中读取第三行时存在一些问题。 这两个文件中都有数十万条记录。

我建议通过读取整个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)

更新:如果您使用的是Python 2.3+则可以if rollnum in mydict:使用if rollnum in mydict:而不是mydict.has_key(rollnum) 我正在使用python 2.7,两者都可以

P / s:很抱歉没有发表评论,因为它要求我50个声望

我将第一个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM