J'ai un énorme fichier texte.
line 1
line 2
line 3
...
Je l'ai converti en un tableau de listes:
[['String 1'],['String 2'],['String 3'],['String 4'],['String 5'],
['String 6'],['String 7'],['String 8'],['String 9'],['String 9'],
['String 10'], ...]
Je souhaite convertir cette liste en objets JSON, comme ceci:
[{'title1': 'String 1', 'title2': 'String 2', ... , 'title7': 'String 7'},
{'title1': 'String 8', ..., 'title7': 'String 14'}, ...]
Je ne sais pas comment le faire. De l'aide.?
En ajoutant simplement à la réponse de alexce, vous pouvez facilement convertir les données restructurées en JSON:
import json
json.dumps(result)
Il existe quelques problèmes de sécurité potentiels avec les tableaux de niveau supérieur. Je ne sais pas s'ils sont toujours valables avec les navigateurs modernes, mais vous pouvez envisager de l'envelopper dans un objet.
import json
json.dumps({'results': result})
Pour résoudre ce problème, vous devez scinder la liste des entrées en morceaux, par 7 dans votre cas. Pour cela, utilisons cette approche . Ensuite, utilisez un list comprehension produisant une liste de dictionnaires:
>>> from pprint import pprint
>>> l = [['String 1'],['String 2'],['String 3'],['String 4'],['String 5'],
... ['String 6'],['String 7'],['String 8'],['String 9'],['String 10'],
... ['String 11']]
>>> def chunks(l, n):
... """Yield successive n-sized chunks from l."""
... for i in range(0, len(l), n):
... yield l[i:i+n]
...
>>>
>>> result = [{"title%d" % (i+1): chunk[i][0] for i in range(len(chunk))}
for chunk in chunks(l, 7)]
>>> pprint(result)
[{'title1': 'String 1',
'title2': 'String 2',
'title3': 'String 3',
'title4': 'String 4',
'title5': 'String 5',
'title6': 'String 6',
'title7': 'String 7'},
{'title1': 'String 8',
'title2': 'String 9',
'title3': 'String 10',
'title4': 'String 11'}]
Comme @alecxe l'a souligné, vous devez diviser le tableau de listes que vous avez obtenu à partir du fichier en groupes de valeurs comportant 7 éléments ou moins. Vous pouvez ensuite prendre une liste des 7 titres de votre choix et les utiliser comme clés pour créer le dictionnaire de chaque objet json de la liste finale.
try:
from itertools import izip
except ImportError: # Python 3
izip = Zip
try:
xrange
except NameError: # Python 3
xrange = range
def grouper(n, sequence):
for i in xrange(0, len(sequence), n):
yield sequence[i:i+n]
data = [['String 1'],['String 2'],['String 3'],['String 4'],['String 5'],
['String 6'],['String 7'],['String 8'],['String 9'],['String 9'],
['String 10']]
titles = ['title1', 'title2', 'title3', 'title4', 'title5', 'title6', 'title7']
values = [e[0] for g in grouper(7, data) for e in g]
keys = (titles[i%7] for i in xrange(len(values)))
objs = [dict(g) for g in grouper(7, list(izip(keys, values)))]
print(objs)
Sortie:
[{'title1': 'String 1', 'title2': 'String 2', 'title3': 'String 3',
'title4': 'String 4', 'title5': 'String 5', 'title6': 'String 6',
'title7': 'String 7'}, {'title1': 'String 8', 'title2': 'String 9',
'title3': 'String 9', 'title4': 'String 10'}]
Définissez une classe en tant que type personnalisé avant la sérialisation. Puis définissez ceci dans une boucle de la classe principale et retournez à l'aide de json.dumps ()
import json
class CustomType:
def __init__(self, title, text):
self.title = title
self.text = text
def toJSON(self):
'''
Serialize the object custom object
'''
return json.dumps(self, default=lambda o: o.__dict__, sort_keys=True, indent=4)
en classe principale:
def get_json_data():
'''
Convert string array to json array
'''
result = []
for item in data:
obj = CustomType("title(n)",item)
result.append(json.loads(obj.toJSON()))
return json.dumps(result)