按列添加两个CSV文件

时间:2013-11-13 08:08:41

标签: python bash csv io append

假设我在A中有两个名为BPython的CSV文件。

A的{​​{1}}看起来像是:

head

headerNameA1,headerNameA2 1.12412424,1 1,1 1,1 1,1 的{​​{1}}看起来像是:

B

我的目标是取head并将其附加到 headerNameB1,headerNameB2 1,1 1,1 1,1 1,1 ,以便B看起来像:

A

我问过另一个问题,这里的代码将A headerNameA1,headerNameA2,headerNameB1,headerNameB2 1,1,1.12412424,1 1,1,1,1 1,1,1,1 1,1,1,1 合并为A

B

但是,此问题的目的只是将C添加到 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 的背面。

如果B的大小超出磁盘空间,以便在之后删除A之前将其复制为文件A,那么这是必要的。

通过C调用的bash解决方案是可以接受的

2 个答案:

答案 0 :(得分:1)

您可以使用命名管道。您有一个Python进程运行,它创建一个管道并以写入模式打开它。然后输出到CSV文件的列式连接(类似于你已经得到的)......当另一个进程开始读取该文件时,它将能够使用数据,但实际上没有文件存储在服务器上,它只是按需。当消耗“文件”时,其中将没有任何内容,并且任何访问它的尝试都将阻塞,直到另一个进程写入另一端。

一些虚拟代码 - 需要更多考虑异常处理等......:

import os
from itertools import izip

a = 'abcdef' # File A's rows
b = 'ghijkl' # File B's rows

outname = 'joined'

try:
    os.unlink(outname)
    os.mkfifo(outname)
except OSError:
    pass

with open(outname, 'w') as fout:
    for items in izip(a, b):
        fout.write(''.join(items) + '\n') # Do "real" write here instead...
    os.unlink(outname)

其他东西在读取模式下打开“文件”并使用它来检索数据。这应该有效,除非该过程必须有“物理文件”......

答案 1 :(得分:0)

如果您获得同一文件的两个文件句柄 - 一个处于“读取”模式,一个处于“更新”模式(r+b),则相同的策略应该有效。

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

如果可能的话,我建议不要这样做,只是明确写入第三个文件。