【问题标题】:How to create a Python dictionary from data imported from a text file?如何根据从文本文件导入的数据创建 Python 字典?
【发布时间】:2021-01-01 01:37:44
【问题描述】:

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

David: 2
Barbara: 97.2
David: nothing
William:

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

David: 974.1

我希望能够读取此文件并创建字典。

这是我的代码:

def make_dictionary(file_name):

    d = {}

    with open(file_name, 'r') as file:
        for line in file:
            (key, val) = (line.split(':')[0], line.split(':')[1])

    return print(d)

make_dictionary('my_text.txt')

我收到一个索引错误:

IndexError: 列表索引超出范围

有谁知道错误在哪里?

谢谢!

【问题讨论】:

    标签: python io


    【解决方案1】:

    这个错误是由于空白行引起的。

    您的代码假定split 将为您返回两个元素。

    您需要在尝试使用split 的返回值之前检查空行——然后​​跳过这些行。

    此外,更健壮的代码还将检查该行是否包含用于拆分的冒号 (:)。如果该行不包含冒号,则代码将失败。在这种情况下,您可能希望引发异常,或者至少打印一个错误警告。您还需要使用 strip 来删除无关的空格。

    您的代码也没有分配到字典——所以我也添加了它。还要注意——print 返回None,所以你有return print(d),它会返回None。你会想要返回d,所以我也更新了它。

    还有最后一件事。您可能希望将第二列数据转换为可在 Python 中用作数字的floats,而不是从文件中读取时的字符串。这样做时,无效的行也会引发异常——或者您可能想要捕获它并以不同的方式处理它。

    尝试以下方法:

    def make_dictionary(file_name):
        d = {}
        with open(file_name, 'r') as file:
            for line in file:
                line = line.strip()
                if line == '':
                    # Skip blank lines
                    continue
                elif ':' in line:
                    # Do the split, since we *know* we can
                    key, val = line.split(':')
    
                    # Will raise an exception if the 2nd column is not a valid number
                    d[key.strip()] = float(val.strip())
                else:
                    # Raise an exception if an invalid line is encountered
                    raise ValueError('Cannot split line')
                
        return d
    
    print(make_dictionary('my_text.txt'))
    

    注意:您的原始代码split 两次 行(这是低效且不必要的)。在 Python 中,您可以改为执行并行分配(更称为“解包”)——我已调整代码以使用该方法。

    【讨论】:

    • 你的男女同校不做字典。它打印{},因为没有分配给d
    • 是的,谢谢,我刚刚意识到 OP 的代码也有这个问题。我正在处理IndexError。更新了我的答案以解决这个问题。
    • @costaparas -- 谢谢。我在d[key.strip()] = float(val.strip()) 线上看到ValueError: could not convert string to float: 'xyz'。有没有办法将这些转换为浮点数来解决这个错误?谢谢。
    • 但是xyz 不是一个有效的数字,那么在这种情况下,什么样的演员才有意义呢?引发异常是完全合乎逻辑的行为。或者,您可以捕获异常(使用 except: 子句),然后跳过此类无效行(最好显示和/或记录警告消息)。
    • 我选择删除 float(),这似乎可行。你知道我将如何增加“David”的值,他在源文件中有两个条目(例如,将 David 列为值的 sum)?跨度>
    【解决方案2】:

    您的威廉钥匙没有价值。
    而且你有几行空行。
    所以,在分割线之前,检查它是否不为空,分割之后检查它的长度是否为 2。
    而且,您需要为 d 分配一些东西才能返回它,例如:

    d[key] = value
    

    【讨论】:

      【解决方案3】:

      如果要制作字典,则应使用 .json 文件。这些是为存储类似对象的字典而设计的。

      【讨论】:

      • Json 文件 文本文件。为什么不能从包含键值对的文件中制作字典?您写了“不是专门的文本文件”。如何从二进制文件制作字典?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 2017-07-07
      • 1970-01-01
      相关资源
      最近更新 更多