python通过连接方式逐行合并到文档

时间:2016-10-24 15:04:07

标签: python python-2.7 merge concatenation

我如何加入这两个文本文件?

文件1:

1000001 10:0.471669 250:0.127552 30:0.218773 64:0.249413
1000002 130:0.0839656 107:0.185613 30:0.446355 110:0.38011
1000003 1:0.0835855 1117:0.0647112 302:0.0851354 46:0.0601825 48:0.098907 516:0.167713

文件2:

1000001 161:0.115664 207:0.136537 294:0.0974809 301:0.199868
1000002
1000003 555:0.0585849 91:0.0164101

结果:

1000001 10:0.471669 250:0.127552 30:0.218773 64:0.249413 161:0.115664 207:0.136537 294:0.0974809 301:0.199868
1000002 130:0.0839656 107:0.185613 30:0.446355 110:0.38011
1000003 1:0.0835855 1117:0.0647112 302:0.0851354 46:0.0601825 48:0.098907 516:0.167713 555:0.0585849 91:0.0164101

解释
文档1 文档2 都具有相同的结构,并且它们具有相同的行数。
每行以一个数字开头(两个文档中的数字相同) ),然后我们在每一行中有几个由数字+冒号+十进制数组成的项目:
示例 10:0.471669 这些项目组合是唯一的,我想要做的是将它们合并在一起:从第二个文档中获取每行的项目并将其放在第一个文档的相应行中。
注意:
开头的初始数字和彼此的项目由一个空格分隔。

更新

这是我的尝试:

dat1 = {}
with open('doc1') as f:
    for line in f.readlines():
        dat1[line.split(' ')[0]] = line.strip().split(' ')[1:]

dat2 = {}
with open('doc2') as f:
    for line in f.readlines():
        key = line.split(' ')[0]
        dat2[key] = line.split(' ')[0]

for key in dat1.keys():
    print("%s,%s,%s" % (key, str.join(' ', dat1[key]), str.join(' ', dat2[key])))

但是我在第9行得到索引超出范围的追溯错误。

更新2:

这是更正后的代码:

dat1 = {}
with open('stem.data') as f:
    for line in f.readlines():
        dat1[line.split(' ')[0]] = line.strip().split(' ')[1:]

dat2 = {}
with open('stem.info') as f:
    for line in f.readlines():
        key = line.split(' ')[0]
        dat2[key] = line.split(' ')[1:]

for key in dat1.keys():
    print("%s %s %s" % (key, str.join(' ', dat1[key]), str.join(' ', dat2[key])))

但我又在最后一行收到错误!然而,显然连接正在进行,因为我在视觉上检查了几行;但由于错误而停止。你能告诉我这里有什么问题吗?

1 个答案:

答案 0 :(得分:1)

使用此:

for key in (set(dat1) | set(dat2)):
    print(key, ' '.join(dat1.get(key, '')), ' '.join(dat2.get(key, '')))

您将join应用于数组的方式(此处您不需要字符串格式设置)。

for key in (set(dat1) | set(dat2))将遍历两个词典中的所有键。

使用.get可确保只有一个文件具有该密钥,只会选择其内容(并且不会引发错误)。

此外,for line in f.readlines():可以缩短for line in f:。这将以相同的方式迭代行(由换行符分隔)。

相关问题