【问题标题】:Combining CSV files column-wise按列组合 CSV 文件
【发布时间】:2013-11-25 13:16:57
【问题描述】:

假设我在Python 中有两个名为AB 的CSV 文件。

Ahead 看起来像:

 headerNameA1,headerNameA2
 1.12412424,1
 1,1
 1,1
 1,1

Bhead 看起来像:

 headerNameB1,headerNameB2
 1,1
 1,1
 1,1
 1,1

我的目标是将两者合并成一个文件C。但是,我的目标也是不要将它们加载到 RAM 中,因为它们是大文件。生成的 C 将是:

 headerNameA1,headerNameA2,headerNameB1,headerNameB2
 1.12412424,1,1,1
 1,1,1,1
 1,1,1,1
 1,1,1,1

如果解决方案可以组合多个 CSV 文件,则可获得奖励积分。但是,很好如果这在解决方案中是不可能的,因为我总是可以将其他任何东西与C 组合成D,然后将其他任何东西与D 组合成E ,无限。

解决方案可以基于Python 或基于terminal 通过os.system in Python

【问题讨论】:

  • 那么您在寻找paste -d , f1.csv f2.csv 的Python 版本吗?如果是这样,你看过csv 模块吗?

标签: python ubuntu csv memory-management merge


【解决方案1】:

您可以一次使用两个文件中的一行,将它们连接在一起并写入您的输出文件。 csv 模块让事情变得更简洁。

import csv
with open('A','rb') as f1, open('B','rb') as f2, open('out.csv','wb') as w:
    writer = csv.writer(w)
    r1,r2 = csv.reader(f1),csv.reader(f2)
    while True:
        try:
            writer.writerow(next(r1)+next(r2))
        except StopIteration:
            break

正如@RogerPate 指出的那样,您可以使用itertools.izip 使这个更流畅(如果您使用的是python3,则只需zip

from itertools import izip
import csv
with open('A','rb') as f1, open('B','rb') as f2, open('out.csv','wb') as w:
    writer = csv.writer(w)
    for r1,r2 in izip(csv.reader(f1),csv.reader(f2)):
        writer.writerow(r1+r2)

【讨论】:

  • for r1, r2 in itertools.izip(csv.reader(f1), csv.reader(f2)): writer.writerow(r1 + r2)
  • @RogerPate 不错。添加那个。
  • 编写源代码使其在 2.x 和 3.x 中运行相同(没有 2to3 或类似)是徒劳的。
  • 不打算使用的示例代码不是示例。使用 itertools.izip 并添加注释“在 3.x 中重命名为 'zip'”会更好地为您服务,反之亦然。这更短、更容易理解,而且使用错误的评论比使用不好的例子更难。
  • 请注意,不同版本之间的 csv 文件打开方式存在差异('wb' 在 2,'w', newline='' 在 3)所以它比看起来更麻烦。
猜你喜欢
  • 2010-10-24
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2013-06-28
  • 2017-09-30
  • 2021-03-08
相关资源
最近更新 更多