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