[英]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.