附加两个CSV文件columnwis

2024-06-24 13:09:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Ahead看起来像:

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

Bhead看起来像:

^{pr2}$

我的目标是获取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和{}合并成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

然而,这个问题的目的只是在A的后面加上B。在

如果A的大小太大,在删除A之前将其作为文件C进行复制的磁盘空间太大,则需要这样做。在

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


Tags: 文件csvasopenheadreadernextwriter
2条回答

如果同一个文件有两个文件句柄-一个在“read”模式下,一个在“update”模式下(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)

如果可能的话,我建议不要使用这种方法,只需显式地写入第三个文件。在

你也许可以通过命名管道逃脱惩罚。您有一个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)

其他程序以读取模式打开该“文件”,并使用它来检索数据。除非这个过程必须有“物理文件”。。。在

相关问题 更多 >