Очистка Json файлов в словаре - PullRequest
0 голосов
/ 26 апреля 2020

Я хочу объединить несколько 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' не поддерживает удаление элементов

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

С минимальными изменениями в вашем коде:

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 string в вашем примере, но вы, очевидно, предполагали, что data будет диктатом. На самом деле, json_lines - это диктат, и его лучше назвать json_line.

Примечание: вы никогда не должны называть переменную file, потому что файл является зарезервированным именем в Python. Кроме того, я не вижу, где ValueError может возникнуть в блоке try, но JSONDecodeError может появиться при вызове json.loads.

0 голосов
/ 26 апреля 2020

строка, вызывающая это: data = json.dumps(json_lines)

json.dumps() возвращает JSON форматированную строку

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

...