从文本文件导入数据时,如何增加Python字典中的值?

从文本文件导入数据时,如何增加Python字典中的值?,python,io,Python,Io,我在一个名为my_text.txt的文件中有以下文本: David: 2 Barbara: 97.2 David: negative William: Lynn: 725 Nancy : 87 David: 54 Lewis: 18.30 Sue: 3193.74 James: 41.73 David: 974.1 注意空白行和非数值的值。以下是我从文件导入数据并创建字典的代码: import collections def make_dictionary(f

我在一个名为
my_text.txt
的文件中有以下文本:

David: 2
Barbara: 97.2
David: negative
William:

Lynn: 725
Nancy   : 87
     David:       54
Lewis: 18.30
Sue:   3193.74
James: 41.73

David: 974.1
<>注意空白行和非数值的值。以下是我从文件导入数据并创建字典的代码:

import collections
def make_dictionary(file_name):
    d = collections.defaultdict(float)
    with open(file_name, 'r') as file:
        for line in file:
            line = line.strip()
            
            # skip blank lines
            if line == '':
                continue
            
            # split on the colons
            elif ':' in line:
                key, val = line.split(':')
                
                d[key.strip()] += val.strip()
        
    return d

make_dictionary('my_text.txt')
我希望能够增加字典中的值。例如,David的密钥/值对是:

David : 1030.1
(文件中3个值的总和)

我得到以下错误:

TypeError: unsupported operand type(s) for +=: 'float' and 'str'
你知道怎么解决这个问题吗


谢谢

您正在解析一个文本文件,该文件的值为
str
,但是您使用
float
初始化
defaultdict
,因此它需要float

d[key.strip()] += val.strip()
上述内容应更改为:

d[key.strip()] += float(val.strip())

我将让您自行决定如何处理转换失败。

由于程序试图将整数添加到字符串中而导致的错误

i、 大卫:不,所以你可以用try-except来处理

r = []
with open('t.txt', 'r') as file:
    for line in file:
        line = line.strip()
        # skip blank lines
        if line == '':
            continue
        # split on the colons
        elif ':' in line:
            key, val = line.split(':')
            # try converting it into float else set it set as 0. 
            try:
                val = float(val.strip())
            except:
                val = 0
            r.append({'name': key.strip(), 'val': val})
然后你可以这样总结:

d = collections.defaultdict(float)
for item in r:
    d[item['name']] += item['val']

您可以检查条目是否为“负”,然后将其更改为“确定”,但您需要决定如何处理它。跳过值?回退到某个默认值?中止并通知用户?我要问的问题是如何处理转换失败…您的代码没有显示任何转换,您只需将其保留为字符串。我是否可以检查
val
isnumeric==False
,如果是,则将该
val
写入零并继续?确定这是一个选项,为什么不尝试一下,看看它是否工作得很好,是否能处理所有的类型问题。非常感谢。