【问题标题】:Joining rows in CSV with Python用 Python 连接 CSV 中的行
【发布时间】:2015-08-20 13:14:41
【问题描述】:

我有一个 CSV(约 150 万行),格式如下:

id, tag1, tag2, name1, value1

有几行具有相同的 id。如果一行具有相同的 id,它将具有相同的 tag1 和 tag2。所以,我想做的是在行的末尾附加name1, value1,这将是不同的。

例子:

Original:
    id,tag1,tag2,name1,value1
    12,orange,car,john,32
    13,green,bike,george,23
    12,orange,car,elen,21
Final:
    id,tag1,tag2,name1,value1
    12,orange,car,john,32,elen,21
    13,green,bike,george,23

我能做到这一点的唯一方法是使用 Python 中的蛮力脚本。使用 id 的键创建一个字典,然后创建一个包含所有其他参数的列表。每次我找到一个已经在字典中的 id 时,我只需将字典值中的最后两个字段附加为一个列表。

但是,在如此大的文件中执行此操作并不是最有效的方法。有没有其他方法可以做到这一点,也许是图书馆?

【问题讨论】:

  • 实际上,假设您有足够的内存存储所有数据,这是最有效的方法。
  • 根据您的示例,您的数据未排序,那么使用您的方法是唯一可行的解​​决方案。如果数据已排序,那么您只需将最后读取的行保留在内存中。
  • @Kay 你能给一个排序的 CSV 的答案,所以我可以接受吗?在开始处理之前,我可以轻松地对 CSV 进行排序。
  • @Tasos 如果您从数据库中导出 CSV,那么为什么不在查询中进行正确的分组呢?假设您使用支持它的数据库。
  • @Tasos 好吧,您问的是一种有效的方法,而不是一种简单的方法。 :D 老实说,我怀疑排序会更快。如果我错了,请告诉我。

标签: python csv


【解决方案1】:

Kay 使用排序输入数据的建议可能如下所示:

with open('in.txt') as infile, open('out.txt', mode='w') as outfile:
    # Prime the first line
    line = infile.readline()
    # When collating lines, running_line will look like:
    # ['id,tag1,tag2', 'name1', 'value1', 'name2', 'value2', ...]
    # Prime it with just the 'id,tag1,tag2' of the first line
    running_line = [line[:-1].rsplit(',', 2)[0]]
    while line:
        curr_it12, name, value = line[:-1].rsplit(',', 2)
        if running_line[0] == curr_it12:
            # Current line's id/tag1/tag2 matches previous line's.
            running_line.extend([name, value])
        else:
            # Current line's id/tag1/tag2 doesn't match. Output the previous...
            outfile.write(','.join(running_line) + '\n')
            # ...and start a new running_line
            running_line = [curr_it12, name, value]
        # Grab the next line
        line = infile.readline()
    # Flush the last line
    outfile.write(','.join(running_line) + '\n')

【讨论】:

    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2017-05-05
    • 2020-11-03
    • 2018-08-14
    • 1970-01-01
    • 2018-10-26
    相关资源
    最近更新 更多