【问题标题】:Merge two text files into a dictionary on python将两个文本文件合并到python上的字典中
【发布时间】:2017-11-01 18:06:29
【问题描述】:

我有两个文本文件,我想将它们合并到一个字典中,这样它就包含第一个文本文件的所有行,其中包含来自第一个文本文件和第二个文本文件(如果可用)的值。有人可以帮忙吗?

例如,

a.txt 看起来像这样:

apple 5 7e-6 na 2.2
banana 9 3e-2 2 2.1
orange na 9.2 2.1 na

b.txt 看起来像这样:

orange 5 6.2 na 6e-3 nd
mango 4 7.3 na 7 3
apple 4 4.4 4.3 na 2

我想在 python 上合并这两个文本文件,以便得到如下输出:

apple 5 7e-6 na 2.2 4 4.4 4.3 na 2
banana 9 3e-2 2 2.1 na na na na na
orange na 9.2 2.1 na 5 6.2 na 6e-3 nd

我尝试为这两个文本文件制作两个字典并将它们添加在一起,使用以下代码:

with open('a.txt', 'r') as document:
    a = {}
    for line in document:
        if line.strip():  # non-empty line?
            key, value = line.split(None, 1) 
            a[key] = value.split()

with open('b.txt', 'r') as document:
    b = {}
    for line in document:
        if line.strip():  # non-empty line?
            key, value = line.split(None, 1) 
            b[key] = value.split()

def combineDict(*args):
    result = {}
    for dic in args:
        for key in (result.viewkeys() | dic.keys()):
            if key in dic:
                if type(dic[key]) is list:
                    result.setdefault(key, []).extend(dic[key])
return result

final = combineDict(a,b)

但这也保留了第二个文本文件中的所有值(如“芒果”)

【问题讨论】:

  • 键是拆分的第一个值,列表追加其余部分。这就是提示,否则,你做了什么?你查过如何处理文本文件,列表和字符串操作,有代码吗?
  • 请向我们展示您的尝试
  • 您是否尝试过任何事情,或者您只是要求我们为您做这件事?
  • 香蕉的所有“na na na na ne”值是从哪里来的?为什么输出中没有芒果?
  • 抱歉之前没有分享代码。您现在可以在编辑后的输出中找到它。另外,我不希望芒果出现在最终列表中,因为这不是第一个文本文件中的关键。

标签: python dictionary text merge


【解决方案1】:

一次读入一个文件,并将每一行拆分为键和值,然后将其值添加到数据库中的该键中。

#!/usr/bin/env python3

import io

file_a = io.StringIO("""apple 5 7e-6 na 2.2
banana 9 3e-2 2 2.1
orange na 9.2 2.1 na""")

file_b = io.StringIO("""orange 5 6.2 na 6e-3 nd
mango 4 7.3 na 7 3
apple 4 4.4 4.3 na 2""")

def dict_from_file(f):
    def line_splitter(line):
        items = line.strip().split()
        return items[0], items[1:]
    # To use filenames, change 'f' above to filename and
    # use this line:
    # with open(filename) as f:
    return {k:v
            for line in f
            for k, v in (line_splitter(line),)}

# Read in initial file
d = dict_from_file(file_a)
# For each additional file append values for already
# existing keys. Extend all values to be the same
# length, filling with 'na'.
files = file_b,
for f in files:
    max_length = 0
    for k, v in dict_from_file(f).items():
        if k in d:
            d[k].extend(v)
            max_length = len(d[k])
    for v in d.values():
        v += ['na'] * (max_length - len(v))

for k, v in d.items():
    print(('{:12} ' + '{:6}' * len(v)).format(k, *v))

输出:

apple        5     7e-6  na    2.2   4     4.4   4.3   na    2     
banana       9     3e-2  2     2.1   na    na    na    na    na    
orange       na    9.2   2.1   na    5     6.2   na    6e-3  nd    

【讨论】:

  • 嗨哈维.. 非常感谢.. 我试过了,但它说.. for k, *v in (line.strip().split(),) ^ SyntaxError: invalid syntax 如果我把 v 前面的 * 移到前面,那么它就是 ValueError: too many values to unpack
  • 您使用的是 Python 2 吗?我将其更改为使用 Python 2。您应该使用 Python 3。它比 2 好得多,而且 2 要么不再支持,要么很快就会支持。
猜你喜欢
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多