【问题标题】:Merging records from two '.CSV' files in python在python中合并来自两个'.CSV'文件的记录
【发布时间】:2014-12-10 07:18:28
【问题描述】:

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

【问题讨论】:

  • 是否缺少数据?输入中没有值“LMN”,但它出现在输出中。
  • Roll_num 中的值在每个文件中是否唯一?
  • 用更少的数据试试吧。
  • 这两个文件的数据比较多。所以我只是举个例子。

标签: python csv


【解决方案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)

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多