2

我有三个文本文件。
两个文件(a.txt、b.txt)的格式相同(> 100000000 行,三列数据),
一个是来自 a.txt 和 b.txt 第一列的联合文件。

a.txt ('r')

MARCH2_MARCH2   2.3 0.1
MARCH2_MARC2    -0.22   0
MARCH2_MARCH5   -0.3    0.3
MARCH2_MARCH6   -1.4    0
MARCH2_MARCH7   0.1 0
MARCH2_SEPT2    -1.0    0
MARCH2_SEPT4    0.8 0

b.txt ('r')

MARCH2_MARCH2   2.2 0
MARCH2_MARCH2.1 0.2 0
MARCH2_MARCH3   -0.4    0.1111111
MARCH2_MARCH5   -0.3    0
MARCH2_MARCH6   -0.6    0
MARCH2_MARCH7   1.2 0
MARCH2_SEPT2    0.2 0

c.txt ('r')

MARCH2_MARCH2   
MARCH2_MARCH2.1
MARCH2_MARC2
MARCH2_MARCH5   
MARCH2_MARCH6   
MARCH2_MARCH7
MARCH2_SEPT2    
MARCH2_SEPT4
MARCH2_MARCH3

我想从这些文件中编写新文件,如下所示。
也就是说,将每个文本文件的第二列和第三列中的两个值插入到第一列中包含相同值的对应行(a[0] == c[0] 或 b[0] == c[0])。
因此,新文件中的总列数可能是五。如果没有匹配的值,我只想插入“NA”。

新文件('w')

MARCH2_MARCH2   2.3 0.1 2.2 0
MARCH2_MARCH2.1 NA NA 0.2 0
MARCH2_MARC2    -0.2    0 NA NA
MARCH2_MARCH5   -0.3    0.3 -0.3 0
MARCH2_MARCH6   -1.4    0 -0.6  0
MARCH2_MARCH7   1.2 0 1.2   0
MARCH2_SEPT2    -1.0    0 0.2   0
MARCH2_SEPT4 0.8    0 NA NA
MARCH2_MARCH3 NA NA -0.4 0.1111111

我正在寻找解决方案并尝试了一些不同的方法,包括基于字典的解析。不幸的是,我还是 python 新手,我编写的所有代码都不能正常工作。请把你的手给我。
非常感谢你。

4

1 回答 1

0

假设您的文件被TAB分隔,这应该工作:

values = collections.defaultdict(lambda : collections.defaultdict(lambda : "NA NA"))
inputfiles = ['a.txt', 'b.txt']
for fname in inputfiles:
  with open(fname) as infile:
    for line in infile:
      field, vals = line.strip().split('\t', 1)
      values[field][fname] = vals

with open('c.txt') as infile, open('d.txt', 'w') as outfile:
  for line in infile:
    field = line.strip()
    outfile.write("%s\t" %field)
    for fname in inputfiles:
      outfile.write("%s\t" %values[field][fname])
    outfile.write('\n')

输出

MARCH2_MARCH2   -0.22   0       2.2 0   
MARCH2_MARCH2.1 NA NA   0.2 0   
MARCH2_MARC2    NA NA   NA NA   
MARCH2_MARCH5   -0.3    0.3     -0.3    0       
MARCH2_MARCH6   -1.4    0       -0.6    0       
MARCH2_MARCH7   0.1 0   1.2 0   
MARCH2_SEPT2    -1.0    0       0.2 0   
MARCH2_SEPT4    0.8 0   NA NA   
MARCH2_MARCH3   NA NA   -0.4    0.1111111
于 2013-10-23T22:05:21.993 回答