【问题标题】:Cleaning Json files in a dictionary清理字典中的 Json 文件
【发布时间】:2020-04-25 21:02:28
【问题描述】:

我想在字典中组合多个 json 文件并复制选定的字段。

我在下面给出代码。 json 文件是 Twitter 数据的集合。 json 文件已损坏,因此会读取各个行。

请帮我解决错误

import json
import os

path = "E:/proj/Project tweets/2019_07_01/01/"
filelist = os.listdir(path)



for filename in filelist:
    if filename.endswith(".json"):
        with open(path + filename, 'r') as file:
            lines = file.readlines()
            for line in lines:
                json_lines = json.loads(line)
                try:
                    tags = ["created_at", "text", "user_location"]
                    data = json.dumps(json_lines)

                    for i in data:
                        if i not in tags:
                            del data[i]
                    with open('out_01_01.json', 'a') as file:
                        file.write(data)
                except ValueError:
                    continue

我收到以下错误

TypeError: 'str' 对象不支持删除项目

【问题讨论】:

  • data = json.dumps(json_lines) : data 现在是 string
  • 你的错误在于 for i in data 循环(不正确的可迭代)

标签: python json file dictionary tweets


【解决方案1】:

导致此问题的行:data = json.dumps(json_lines)

json.dumps() 返回一个 JSON 格式的字符串

https://docs.python.org/3/library/json.html

【讨论】:

    【解决方案2】:

    对代码进行最少的更改:

    import json
    import os
    
    path = "E:/proj/Project tweets/2019_07_01/01/"
    filelist = os.listdir(path)
    
    for filename in filelist:
        if filename.endswith(".json"):
            with open(path + filename, 'r') as file:
                lines = file.readlines()
                for line in lines:
                    json_line = json.loads(line)
                    try:
                        tags = ["created_at", "text", "user_location"]
                        for i in json_line:
                            if i not in tags:
                                del json_line[i]
                        with open('out_01_01.json', 'w') as file:
                            file.write(json.dumps(json_line))
                    except ValueError:
                        continue
    

    但是,您的代码可以通过多种方式进行改进。

    如果行可能损坏:

    import json
    import os
    
    path = 'E:/proj/Project tweets/2019_07_01/01'
    filelist = [filex if filex.endswith('.json') for filex in os.listdir(path)]  
    tags = {'created_at', 'text', 'user_location'}
    output = []
    
    for filename in filelist:
        with open(os.path.join(path, filename), 'r') as f:
            lines = f.readlines()
        for line in lines:
            try:
                json_line = json.loads(line)
            except JSONDecodeError:
                continue
            output.append(dict((k, v) if k in tags for k, v in json_line.values()))
    with open('out_01_01.json', 'a') as f:
        json.dump(output, f)
    

    否则你可以这样做:

    import json
    import os
    
    path = 'E:/proj/Project tweets/2019_07_01/01'
    filelist = [filex if filex.endswith('.json') for filex in os.listdir(path)]  
    tags = {'created_at', 'text', 'user_location'}
    output = []
    
    for filename in filelist:
        output = [dict((k, v) if k in tags for k, v in json_line.values()) for json_line in (json.loads(l) for l in open(os.path.join(path, filename), 'r').readlines())]
    
    with open('out_01_01.json', 'w') as f:
        json.dump(output, f)
    

    问题是 data 在您的示例中是一个 JSON 字符串,但您显然假设 data 将是一个字典。事实上,json_lines 是一个字典,最好命名为json_line

    注意:您永远不应该将变量命名为file,因为文件是 Python 中的保留名称。此外,我看不到在 try 块中可能会出现 ValueError 的地方,但是当您调用 json.loads 时可能会出现 JSONDecodeError。

    【讨论】:

    • 我尝试了建议的程序,但出现“内存错误”。
    • MemoryError 表示你 ran out of virtual address space。你试过哪个版本?我修改了最后一个,以便这些行不会立即读入列表,而是由生成器表达式产生。不过改动最少的版本,都是一行一行的读写,所以应该不会占用太多内存。
    猜你喜欢
    • 2019-05-28
    • 2020-12-15
    • 2016-03-08
    • 2018-05-11
    • 1970-01-01
    • 2017-03-25
    • 2018-04-17
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多