0

假设我有两个名为 的 CSV文件A和.BPython

Ahead样子:

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

Bhead样子:

 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

但是,这个问题的目的只是添加BA.

如果 的大小对于磁盘空间来说太昂贵而无法在之后删除之前A将其复制为文件,这将是必要的。CA

通过调用的 bash 解决方案os.system是可以接受的

4

2 回答 2

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)

其他东西以读取模式打开该“文件”并使用它来检索数据。除非该过程必须具有“物理文件”,否则这应该可以工作...

于 2013-11-13T10:10:39.880 回答
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)

如果可能的话,我会建议反对这种事情,而只是明确地写入第三个文件。

于 2013-11-13T08:11:32.493 回答