2016-05-31 2 views
0

У меня есть файлы ~ 100k JSON, каждый из которых содержит JSON, который я прокручиваю, чтобы создать модель слов с мешками - очень просто. Каждый файл JSON выглядит следующим образом:Извлечение частей JSON из списка json.loads в python

[{"tokens":[{"word":"Voices","lemma":"voice","pos":"NNS","ner":"O"},{"word":"from","lemma":"from","pos":"IN","ner":"O"},{"word":"Russia","lemma":"Russia","pos":"NNP","ner":"LOCATION"}],"dependencies":[{"head":0,"dep":2,"label":"prep_from"}]},{"tokens":[{"word":"Wednesday","lemma":"Wednesday","pos":"NNP","ner":"DATE"},{"word":",","lemma":",","pos":",","ner":"DATE"},{"word":"11","lemma":"11","pos":"CD","ner":"DATE"}, 
.... 

Что мне нужно, чтобы извлечь только значения "word" ключей для каждого файла и сохранить этот массив в новом файле, так что каждый файл имеет массив как:

["Voices", "from", "Wednesday","Russia", "," ,"11"...]

А также у меня есть массив для похож всех файлов вместе взятых, хранящегося в ../../data/train_jsons/all_words.json

Однако json.loads создает список для каждого элемента не Dict. Как я могу достичь того, что хочу, просто перейдя по списку для каждого файла и сохраняя эти отдельные массивы слов в новых файлах, которые поддерживают имя пути к файлу json, например. новые файлы под названием ../../data/train_jsons/words_for_.........json?

Попытка преобразовать в Словаре и с помощью кнопки «слово», кажется, не работает на:

for subdir, dirs, files in os.walk('../../data/train_jsons'): 
    for file in files: 
     filepath = subdir + os.sep + file 
     if filepath.endswith(".json"): 
      with open(filepath) as data_file: 
       data = json.load(data_file) 
       dict = dict(itertools.izip_longest(*[iter(data)] * 2, fillvalue="")) 

Скорость является ключевым фактором в моем решении.

ответ

1

d = [{'tokens': [{'lemma': 'voice', 'ner': 'O', 'word': 'Voices', 'pos': 'NNS'}, { 'lemma': 'from', 'ner': 'O', 'word': 'from', 'pos': 'IN'}, {'lemma': 'Russia', 'ner': 'LOCATION', 'LOCATION', ' 'word': 'Россия', 'pos': 'NNP'}], 'dependencies': [{'dep': 2, 'head': 0, 'label': 'prep_from'}]}]

это сработало для меня

[u['word'] for u in x['tokens'] for x in d] 
+0

Спасибо! Это сработало, я просто конвертировал в 'для x в данных: для u в x ['tokens']: print u ['word']' –

+0

Решение очень медленное, к сожалению, хотя у меня есть около 100 000 json-файлов, таких как вышесказанное. Есть ли решение, которое может быть быстрее? –

+0

Печать выполняется медленно, вы можете предварительно выделить, указав большой список, заполняющий цикл. Затем вы можете многопоточно и рассматривать PyPy. – marmouset

Смежные вопросы