假设我在A
中有两个名为B
和Python
的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解决方案是可以接受的
答案 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)
如果可能的话,我建议不要这样做,只是明确写入第三个文件。