在python中合并两个“.CSV”文件中的记录

2024-04-26 06:08:32 发布

您现在位置: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\u 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循环中读取第三行时出现了一些问题。 我们在这两个档案里都有数十万条记录。你知道吗


Tags: 文件csvpathnamereaddatalineall
2条回答

我建议通过阅读全文来避免loop in loop类名.csv先归档并放入词典。我建议如下

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:而不是mydict.has_key(rollnum)。我使用的是Python2.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

相关问题 更多 >