2016-10-12 2 views
0

Ich habe eine Textdatei mit Ort Daten gefüllt von twitter api gefüllt. Hier ist die Probendaten aus 2 ZeilenKonvertieren in die Liste des Wörterbuchs

{'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'} 

Ich will ‚Land‘, ‚Name‘ und ‚cordinates‘ eingereicht jedes line.In Um dies wir tun müssen, Zeile für Zeile durchlaufen die gesamte file.so i anhängen jede Zeile in einer Liste

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

, wenn ich den Datentyp überprüft es als ‚str‘ zeigt anstelle von ‚dict‘.

type(data[0]) 
str 

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

wie Sie dies beheben, so dass es als Liste von Wörterbüchern gespeichert werden kann.

Ursprünglich Tweets wurden codiert und decodiert durch folgenden Code:

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

Und Platz Datendatei durch folgenden Code gespeichert wird:

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

Sie lesen eine Zeichenfolge, die aussieht wie '{'country': 'United Kingdom', ...}' usw. Sie möchten dies jedoch analysieren und in ein Wörterbuch umwandeln. Ich empfehle die Verwendung eines JSON-Parsers, um Ihre Arbeit zu erleichtern. :) – apnorton

+0

Um zu @ apnortons Kommentar hinzuzufügen, wird Python mit einer [JSON-Bibliothek] ausgeliefert (https://docs.python.org/2/library/json.html) – UnholySheep

+0

Die rationale Lösung ist das Speichern der Dateien im Json-Format und einfach Laden der Daten im erwarteten Format. Wenn es nicht möglich ist, können Sie 'ast.literal_eval' verwenden, um die Zeichenfolge als Python-Objekte auszuwerten. – Kasramvd

Antwort

1

Note: Single quotes are not valid JSON.

Ich habe noch nie Twitter API versucht. Sieht so aus, als wären Ihre Daten kein gültiger JSON. Hier ist eine einfache Methode Vorprozess ' (Apostroph) in " (doppelte Anführungszeichen)

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

gibt es keine Anführungszeichen entweder Einzel- oder Doppel am Ende und Anfang jeder Zeile, so dass ich denke, wir müssen hinzufügen, anstatt zu ersetzen doppelte Anführungszeichen am Anfang und am Ende der Zeile. Wie können wir das erreichen? – Khurshid

+0

ich danke dir sehr, das Konvertieren von einfachen Anführungszeichen in doppelte Anführungszeichen funktioniert.Ich bin ein naive Programmierer, ich interpretierte deine Antwort zuerst falsch, wirklich tut mir leid dafür – Khurshid

2

In Ihrem Fall sollten Sie json verwenden, um die Daten-Analyse zu tun . Aber wenn Sie ein Problem mit json haben (was fast unmöglich ist, da wir über eine API sprechen), dann in der Regel aus Zeichenfolge zu konvertieren Wörterbuch, das Sie tun können:

>>> 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 jetzt ein Wörterbuch anstelle von a Zeichenfolge. Aber wieder, wenn Ihre Daten im JSON-Format sind Python hat eine eingebaute lib json Format, und ist besser und sicherer zu json als ast verwenden.

Zum Beispiel, wenn Sie das bekommen sagt eine Antwort lassen resp Sie einfach tun könnten:

response = json.loads(resp) 

und Sie response als Wörterbuch parsen können jetzt.

+0

Eine zweite ist besser –

+0

@ZagorulkinDmitry, wenn Sie JSON meinen, ja völlig zustimmen, es ist viel besser in diesen Fällen, wenn Sie mit einer API zu tun haben. – coder

+0

Siehe [Ist eval in Python eine schlechte Praxis?] (Http://stackoverflow.com/questions/1832940/is-using-eval-in-python-a-bad-practice) – C8H10N4O2

0

können Sie die Liste verwenden wie diese

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

Dies ist nicht mit der Frage überhaupt verbunden (und antwortet nicht) – UnholySheep

1

Sie Python json Bibliothek für das Parsen und bekommen den Wert verwenden sollten zu ersetzen. In Python ist es ziemlich einfach.

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"]) 
Verwandte Themen