【问题标题】:Json written textfile - finding all integersJson 编写的文本文件 - 查找所有整数
【发布时间】:2020-05-24 09:54:47
【问题描述】:

我有一个 .txt 文件,因为它是一个 json 文件。 里面有很多列表、字典、整数等,我需要从那里取出所有数字并返回它的总和。

{"e":[[{"e":86,"c":23,"a":{"a":[120,169,"green","re​​d","orange"],"b ":"red"},"g":"yellow","b":["yellow"],"d":"red","f":-19},{"e":-47," a":[2iolet"},"c":"绿色","h":"橙色","b":{"e":59,"a":"黄色","d":"绿色" ,"c":47,"h":"红色","b":"蓝色","g":"橙色","f":["紫罗兰色",43,168,78]},"g": "橙色","f":[{"e":[82,-41,2,"红色","紫罗兰色","橙色","黄色"],"c":"绿色","a" :77,"g":"橙色","b":147,"d":49,"f":"蓝色"},-1,142,136,[":41,"f":63},11,- 20,{"e":[100,43,183],"a":"黄色","d":["橙色","黄色","紫罗兰色","黄色",143,162,-23,168,145,-33] }

这只是这个文件的一小部分。

def list_dig(lst):
    tmp_int = 0
    for element in lst:
        if type(element) == dict:
            dict_dig(element)
        elif type(element) == int:
            tmp_int += element
        elif type(element) == list:
            list_dig(element)
    return tmp_int


def dict_dig(dictionary):
    tmp_int = 0
    for key in dictionary:
        if type(dictionary[key]) == list:
            tmp_int += list_dig(dictionary[key])
        elif type(dictionary[key]) == int:
            tmp_int += dictionary[key]
        elif type(dictionary[key]) == dict:
            dict_dig(dictionary[key])
    return tmp_int


with open('json_written.txt', 'r') as file:
    counter = 0
    tmp = file.read()
    for i in tmp:
        if type(i) == list:
            counter += list_dig(i)
        elif type(i) == dict:
            counter += dict_dig(i)
        elif type(i) == int:
            counter += i

    print(counter)

我写了类似的东西,但我确定那是垃圾,因为它一直返回 0 作为计数器,我被卡住了。我该如何解决这个问题?也许我应该使用熊猫,但如果是的话 - 如何? 谢谢大家的回答

【问题讨论】:

  • 您能解释一下您要求和的内容以及求和的条件是什么吗?这将有助于获得答案,谢谢!您是否也在控制数据如何写入该文件?它非常混乱/无组织,并且有一些语法错误,例如a":[2iolet"} 无效
  • 你的json无效。
  • 这很奇怪,因为我得到这个文件的确切任务:(...)会计软件使用一种特殊的存储格式。他们有一个 JSON 文档,其中包含各种内容:列表 ([1,2,3])、字典 ({"a":1, "b":2})、数字和字符串。您的工作是简单地找到整个文档中的所有数字并将它们加在一起。完整文件链接:pastebin.com/azc6e9fD
  • 你读过关于在 Python 中解析 JSON 的文章吗?

标签: python arrays json


【解决方案1】:

好的,我想我解决了一个问题。

所以 json 文件没有正确写入,所以我不得不找到其他解决方案来计算该文件中所有整数的总和。

我决定创建一个要替换的字符列表,将所有文件视为字符串并将所有不需要的字符替换为 x,然后将其拆分为 x 并删除空字段。然后我将所有字段从字符串转换为整数,最后将它们加在一起。

你有什么可以简化的吗?

char_list = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
             '{','}','"',':','[',']','(',')',',']


with open("skychallenge_accounting_input.txt", 'r') as file:
    sky_data = file.read()

    for char in char_list:
        sky_data = sky_data.replace(char, 'x')

    sky_list = sky_data.split('x')

    while '' in sky_list:
        sky_list.remove('')

    for i in range(len(sky_list)):
        sky_list[i] = int(sky_list[i])

    print(sum(sky_list))

【讨论】:

    【解决方案2】:

    使用json模块加载嵌套的dict,否则文本文件不会被识别为dict或list,只是一个字符串:

    import json
    
    with open("file.txt", 'r') as f:
        data = json.load(f)
    

    现在您可以使用带有isinstance 的递归函数来对所有整数求和:

    def recursive_sum_ints(some_dict, total=0):
        for v in some_dict.values():
            if isinstance(v, int):
                 total += v
            elif isinstance(v, list):
                 total += sum(x for x in v if isinstance(x, int))
            else:
                 total += recursive_sum_ints(v, total)
        return total
    

    然后简单地调用

    result = recursive_sum_ints(data)
    print(result)
    

    【讨论】:

    • 好吧,如果我这样做,我会收到错误:AttributeError: 'str' object has no attribute 'read',这就是 json.load()
    • @MrLok3rs 阅读前需要先打开文件。以 open("text.txt") 作为流: data = json.load(stream)
    • 添加到答案中,api在我的记忆中的工作方式略有不同。
    猜你喜欢
    • 1970-01-01
    • 2016-03-22
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2017-03-19
    • 2020-12-15
    相关资源
    最近更新 更多