2016-10-12 5 views
0

У меня есть текстовый файл, заполненный данными о месте, предоставленными twitter api. Вот выборочные данные 2 линииПреобразование в список словарей

{'country': 'United Kingdom', 'full_name': 'Dorridge, England', 'id': '31fe56e2e7d5792a', 'country_code': 'GB', 'name': 'Dorridge', 'attributes': {}, 'contained_within': [], 'place_type': 'city', 'bounding_box': {'coordinates': [[[-1.7718518, 52.3635912], [-1.7266702, 52.3635912], [-1.7266702, 52.4091167], [-1.7718518, 52.4091167]]], 'type': 'Polygon'}, 'url': 'https://api.twitter.com/1.1/geo/id/31fe56e2e7d5792a.json'} 

{'country': 'India', 'full_name': 'New Delhi, India', 'id': '317fcc4b21a604d5', 'country_code': 'IN', 'name': 'New Delhi', 'attributes': {}, 'contained_within': [], 'place_type': 'city', 'bounding_box': {'coordinates': [[[76.84252, 28.397657], [77.347652, 28.397657], [77.347652, 28.879322], [76.84252, 28.879322]]], 'type': 'Polygon'}, 'url': 'https://api.twitter.com/1.1/geo/id/317fcc4b21a604d5.json'} 

Я хочу, чтобы «страна», «имя» и «cordinates» подали каждого заказа line.In, чтобы сделать это, мы должны повторять построчно весь file.so я добавить каждую строку в список

data = [] 
with open('place.txt','r') as f: 
    for line in f: 
     data.append(line) 

, когда я проверил тип данных он показывает, как «ул» вместо «Словаря».

type(data[0]) 
str 

data[0].keys() 
AttributeError: 'str' object has no attribute 'keys' 

Как исправить это, чтобы его можно было сохранить в виде списка словарей.

Первоначально твиты были закодированы и декодируются следующим кодом:

f.write(jsonpickle.encode(tweet._json, unpicklable=False) + '\n') #encoded and saved to a .txt file 
tweets.append(jsonpickle.decode(line)) # decoding 

и место файла данные сохраняются по следующему коду:

fName = "place.txt" 
newLine = "\n" 
with open(fName, 'a', encoding='utf-8') as f: 
    for i in range(len(tweets)): 
     f.write('{}'.format(tweets[i]['place']) +'\n') 
+1

Вы читаете строку, которая выглядит как '{'country': 'United Kingdom', ...}' и т. Д. Однако вы хотите проанализировать это и превратить его в словарь. Я рекомендую использовать парсер JSON, чтобы упростить вашу работу. :) – apnorton

+0

Чтобы добавить комментарий к @ apnorton, Python поставляется с [JSON library] (https://docs.python.org/2/library/json.html) – UnholySheep

+0

Рациональное решение - это сохранение файлов в формате Json и легко загрузка данных в ожидаемом формате. Если это невозможно, вы можете использовать 'ast.literal_eval', чтобы оценить строку как объекты python. – Kasramvd

ответ

1

Note: Single quotes are not valid JSON.

Я никогда не пробовал Twitter API. Похоже, ваши данные недействительны JSON. Вот простой способ предобработки заменить ' (одинарные кавычки) в " (двойные кавычки)

data = "{'country': 'United Kingdom', ... }" 

json_data = data.replace('\'', '\"') 
dict_data = json.loads(json_data) 
dict_data.keys() 
# [u'full_name', u'url', u'country', ... ] 
+0

нет ни кавычек ни одного или двойного в конце и начале каждой строки, поэтому я думаю, что нам нужно добавить вместо замены двойные кавычки в начале и конце строки. Как мы можем достичь этого? – Khurshid

+0

Большое спасибо за конвертацию одиночных кавычек в двойные кавычки. Я наивный программист, я сначала неправильно интерпретировал ваш ответ, очень жаль, что – Khurshid

2

В вашем случае вы должны использовать json делать синтаксический анализ данных , Но если у вас есть проблемы с json (что почти невозможно, так как мы говорим о API), то в общем случае для преобразования из строки в словарь вы можете сделать:

>>> import ast 
>>> x = "{'country': 'United Kingdom', 'full_name': 'Dorridge, England', 'id': '31fe56e2e7d5792a', 'country_code': 'GB', 'name': 'Dorridge', 'attributes': {}, 'contained_within': [], 'place_type': 'city', 'bounding_box': {'coordinates': [[[-1.7718518, 52.3635912], [-1.7266702, 52.3635912], [-1.7266702, 52.4091167], [-1.7718518, 52.4091167]]], 'type': 'Polygon'}, 'url': 'https://api.twitter.com/1.1/geo/id/31fe56e2e7d5792a.json'} 
" 
>>> d = ast.literal_eval(x) 
>>> d 

d теперь словарь вместо строка. Но еще раз, если ваши данные в формате json. Python имеет встроенную библиотеку для обработки json формата, и лучше и безопаснее использовать json, чем ast.

Например, если вы получите ответ, скажем, resp вы могли бы просто сделать:

response = json.loads(resp) 

и теперь можно разобрать response как словарь.

+0

Второй лучше –

+0

@ ZagorulkinDmitry, если вы имеете в виду json, да, полностью согласен, в тех случаях, когда речь идет об API, намного лучше. – coder

+0

См. [Использует ли eval в Python плохую практику?] (Http://stackoverflow.com/questions/1832940/is-using-eval-in-python-a-bad-practice) – C8H10N4O2

0

Вы можете использовать список, как этот

mlist= list() 
for i in ndata.keys(): 
    mlist.append(i) 
+0

Это не связано с вопросом вообще (и не отвечает на него) – UnholySheep

1

Вы должны использовать питон библиотеку JSON для синтаксического анализа и получения значения. В python это довольно просто.

import json 
x = '{"country": "United Kingdom", "full_name": "Dorridge, England", "id": "31fe56e2e7d5792a", "country_code": "GB", "name": "Dorridg", "attributes": {}, "contained_within": [], "place_type": "city", "bounding_box": {"coordinates": [[[-1.7718518, 52.3635912], [-1.7266702, 52.3635912], [-1.7266702, 52.4091167], [-1.7718518, 52.4091167]]], "type": "Polygon"}, "url": "https://api.twitter.com/1.1/geo/id/31fe56e2e7d5792a.json"}' 
y = json.loads(x) 
print(y["country"],y["name"],y["bounding_box"]["coordinates"]) 
Смежные вопросы