【发布时间】:2021-06-08 18:53:35
【问题描述】:
来自How to get the pivot lines from two tab-separated files?,有一种快速的方法可以使用 unix 命令来旋转两个文件中的行。
如果我们有两对文件:
-
f1a和f1b -
f2a和f2b
目标是提供一个以制表符分隔的 3 列文件,其中包括:
- f1a / f2a
- f1b
- f2b
其中f1a / f2a 是文件中出现在f1a 和f1b 中的行:
我尝试了以下方法,但如果文件非常大,存储f1 和f2 字典将占用大量内存。例如。数十亿行的文件。
import sys
from tqdm import tqdm
f1a, f1b, f2a, f2b = sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]
# Read first pair of file into memory.
with open(f1a) as fin_f1a, open(f1a) as fin_f1b:
f1 = {s.strip().replace('\t', ' ') :t.strip().replace('\t', ' ') for s, t in tqdm(zip(fin_f1a, fin_f1b))}
with open(s2) as fin_f2a, open(t2) as fin_f2b:
f2 = {s.strip().replace('\t', ' ') :t.strip().replace('\t', ' ') for s, t in tqdm(zip(fin_f2a, fin_f2b))}
with open('pivoted.tsv', 'w') as fout:
for s in tqdm(f1.keys() & f2.keys()):
print('\t'.join([s, f1[s], f2[s]]), end='\n', file=fout)
是否有更快/更好/更简单的方法在 Python 中实现相同的 3 列制表符分隔文件?是否有库可以有效地对大文件执行此类操作?
使用turicreate.SFrame,我也可以这样做:
from turicreate import SFrame
f1a, f1b, f2a, f2b = sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]
sf1a = SFrame.read_csv(f1a, delimited='\0', header=False)
sf1b = SFrame.read_csv(f1b, delimited='\0', header=False)
sf2a = SFrame.read_csv(f2a, delimited='\0', header=False)
sf2b = SFrame.read_csv(f2b, delimited='\0', header=False)
sf1 = sf1a.join(sf1b)
sf2 = sf2a.join(sf2b)
sf = sf1.join(sf2, on='X1', how='left')
sf.save('pivoted')
【问题讨论】:
标签: python performance csv dictionary memory-efficient