Как удалить ненужные элементы из набора данных - PullRequest
1 голос
/ 07 марта 2019

У меня есть набор данных, и он выглядит следующим образом:

 {0: {"address": 0,
         "ctag": "TOP",
         "deps": defaultdict(<class "list">, {"ROOT": [6, 51]}),
         "feats": "",
         "head": "",
         "lemma": "",
         "rel": "",
         "tag": "TOP",
         "word": ""},
     1: {"address": 1,
         "ctag": "Ne",
         "deps": defaultdict(<class "list">, {"NPOSTMOD": [2]}),
         "feats": "_",
         "head": 6,
         "lemma": "اشرف",
         "rel": "SBJ",
         "tag": "Ne",
         "word": "اشرف"},

Я хочу удалить "deps":...? из этого набора данных.Я пробовал этот код, но он не работает, потому что значение "depts": отличается в каждом элементе dict.

import re
import simplejson as simplejson

with open("../data/cleaned.txt", 'r') as fp:
    lines = fp.readlines()
    k = str(lines)
    a = re.sub(r'\d:', '', k) # this is for removing numbers like `1:{..`
    json_data = simplejson.dumps(a)
    #print(json_data)
    n = eval(k.replace('defaultdict(<class "list">', 'list'))
    print(n)

Ответы [ 3 ]

1 голос
/ 07 марта 2019

Правильный способ будет исправить код, который создал текстовый файл. Это defaultdict(<class "list">, {"ROOT": [6, 51]}) является подсказкой, что он использовал простой repr, когда требовался более умный формат.

Это просто обходной путь для бедного человека, если реальное исправление невозможно.

Избавиться от "deps": ... легко: достаточно прочитать файл по одной строке за раз и отбросить любой, начинающийся с ""deps" (игнорируя начальные пробелы). Но этого недостаточно, потому что файл содержит цифровые клавиши, когда json настаивает на том, чтобы ключи были только текстовыми. Таким образом, цифровой ключ должен быть идентифицирован и заключен в кавычки.

Это может позволить загрузить файл:

импорт ре импортировать simplejson as simplejson

with open("../data/cleaned.txt", 'r') as fp:
    k = ''.join(re.sub(r'(?<!\w)(\d+)', r'"\1"',line)
        for line in fp if not line.strip().startswith('"deps"'))

# remove an eventual last comma
k = re.sub(r',[\s\n]*$', '', k, re.DOTALL)

# uncomment if the file does not contain the last }
# k += '}'

js = json.loads(k)
0 голосов
/ 07 марта 2019

Как насчет

#!/usr/bin/env python
# -*- coding: utf-8 -*-

data = {0: {"address": 0,
            "ctag": "TOP",
            "deps": 'something',
            "feats": "",
            "head": "",
            "lemma": "",
            "rel": "",
            "tag": "TOP",
            "word": ""},
        1: {"address": 1,
            "ctag": "Ne",
            "deps": 'something',
            "feats": "_",
            "head": 6,
            "lemma": "اشرف",
            "rel": "SBJ",
            "tag": "Ne",
            "word": "اشرف"}}

for value in data.values():
    if 'deps' in value:
        del value['deps']
0 голосов
/ 07 марта 2019

Попробуйте

import json
with open("../data/cleaned.txt", 'r') as fp:
    data = json.load(fp)
    for key, value in data.items():
        value.pop("deps", None)

Теперь у вас будут данные без deps.В случае, если вы хотите сбросить записи в новый файл

json.dump(data, "output.json")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...