【问题标题】:Python csv: merge rows with same fieldPython csv:合并具有相同字段的行
【发布时间】:2016-11-15 22:07:14
【问题描述】:

鉴于两个单元格包含相同的数据,我正在尝试将多行 csv 数据合并为一长行。例如,采用以下 csv:

one, two, three
1, 2, 3
4, 5, 6
7, 8, 9
1, 1, 1
4, 4, 4

如果两行在 row[0] 处共享相同的值,我希望将第二行附加到第一行。所以我的最终产品应该是这样的:

one, two, three
1, 2, 3, 1, 1, 1
4, 5, 6, 4, 4, 4
7, 8, 9

这是我目前的尝试:

import csv

uniqueNum = []
uniqueMaster = []
count = -1
with open("Test.csv", "rb") as source:
    reader = csv.reader(source)
    header = next(reader)
    for row in reader:
        if row[0] not in uniqueNum:
            uniqueMaster.append(row)
            uniqueNum.append(row[0])
            count = count + 1
            for row in reader:
                if row[0] in uniqueNum:
                    uniqueMaster[count].append(row)

with open("holding.csv","wb") as result:
    writer = csv.writer(result)
    writer.writerow(header)
    for row in uniqueMaster:
        writer.writerow(row) 

我觉得一切正常,但我的脚本只输出以下内容:

one, two, three
1, 2, 3, ['1', '1', '1']

这显然是错误的,原因有两个。首先,它不会遍历整个 csv,其次,附加值被压缩到一个单元格中,而不是单个单元格中。如果有人对让它正常工作有任何建议,我将不胜感激!

【问题讨论】:

    标签: python csv


    【解决方案1】:

    改用字典。从你的代码中间开始(假设我已经声明了一个名为 my_dict 的字典):

     for row in reader:
        if row[0] in my_dict.keys():
           my_dict[row[0]].extend(row)
        else:
           my_dict[row[0]]=row
      #...now we are at the bottom of your code, writing to the csv
     for v in my_dict.values():
        writer.writerow(v)
    

    【讨论】:

    • 感谢您的回复。这几乎做到了 - 行落入正确的位置,但它们的格式不正确。例如,第一个键/值对是:{'1': ['1', '2', '3', ['1', '1', '1']]},而它们应该看起来像这样:{'1': ['1', '2', '3', '1', '1', '1']}。关于修复这最后一部分的任何建议?
    • 已修复。它应该使用extend() 而不是append()。有关更多信息,请参阅此post。特别是 Aaron Hall 给出了一个很好的解释,其中包括运行时。
    • 做到了!感谢您的字典速成课程!
    【解决方案2】:
    import csv
    
    csv_dict = {}
    
    with open("Test.csv", "r") as source:
        reader = csv.reader(source)
        header = next(reader)
    
        for row in reader:
            if row[0] in csv_dict:
                csv_dict[row[0]] += row
            else:
                csv_dict[row[0]] = row
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 2021-12-30
      • 2012-03-25
      • 1970-01-01
      • 2013-04-15
      • 2019-12-13
      • 2016-02-22
      相关资源
      最近更新 更多