2016-05-02 1 views
0

J'ai essayé différentes solutions pour résoudre mon problème avec des nouvelles lignes "amusantes" dans mon dictionnaire json et aucune d'entre elles ne fonctionne. Je pensais que je pourrais faire un post. Le dictionnaire est réalisé en grattant un site Web.Suppression de n \ n et d'autres caractères indésirables d'un dictionnaire json unicode avec python

j'ai un dictionnaire JSON:

my_dict = { 
    u"Danish title": u"Avanceret", 
    u"Course type": u"MScTechnol", 
    u"Type of": u"assessmen", 
    u"Date": u"\nof exami", 
    u"Evaluation": u"7 step sca", 
    u"Learning objectives": u"\nA studen", 
    u"Participants restrictions": u"Minimum 10", 
    u"Aid": u"No Aid", 
    u"Duration of Course": u"13 weeks", 
    u"name": u"Advanced u", 
    u"Department": u"31\n", 
    u"Mandatory Prerequisites": u"31545", 
    u"General course objectives": u"\nThe cour", 
    u"Responsible": u"\nMartin C", 
    u"Location": u"Campus Lyn", 
    u"Scope and form": u"Lectures, ", 
    u"Point(ECTS)": u"10", 
    u"Language": u"English", 
    u"number": u"31548", 
    u"Content": u"\nThe cour", 
    u"Schedule": u"F4 (Tues 1" 
} 

J'ai dépouillé le contenu de la valeur à [:10] pour réduire l'encombrement, mais certaines valeurs ont une longueur de 300 caractères. Il n'est peut-être pas bien représenté ici, mais certaines valeurs ont beaucoup de caractères de nouvelle ligne et j'ai essayé beaucoup de différentes solutions pour les supprimer, comme str.strip et str.replace mais sans succès car mes 'valeurs' sont unicode. Et par les valeurs que je veux dire key, value in my_dict.items(). Comment supprimer toutes les nouvelles lignes apparaissant dans mon dictionnaire? (Avec les valeurs mises en évidence lorsque certaines nouvelles lignes sont en fin de ligne, certaines sont en tête et d'autres sont au milieu du contenu: e.i \nI have a\ngood\n idea\n).

EDIT

J'utilise Python v. 2.7.11 et le morceau de code suivant ne produit pas ce que je dois. Je veux que toutes les nouvelles lignes soient changées en un seul caractère d'espace.

for key, value in test.items(): 
    value = str(value[:10]).replace("\n", " ") 
    print key, value 
+2

Veuillez donner un exemple où 'str.replace' ne fonctionne pas. Vous pouvez modifier la question et les ajouter. –

+0

Voulez-vous supprimer les nouvelles lignes ou voulez-vous les remplacer par un seul espace? Vous devez mentionner la version Python que vous utilisez (de préférence avec une étiquette), car la manipulation Unicode est tout à fait différent en Python 2 vs Python 3. Vous pouvez trouver cet article utile: [Pragmatique Unicode] (http://nedbatchelder.com/text/unipain.html), qui a été écrit par SO vétéran Ned Batchelder. –

Répondre

1

Si vous essayez de supprimer tous \n ou tout caractère indésirable en dehors des chiffres ou des lettres puis utilisez regex

for key in my_dict.keys(): 
    my_dict[key] = mydict[key].replace('\\n', '') 
    my_dict[key] = re.sub('[^A-Za-z0-9 ]+', '', my_dict[key]) 
print my_dict 

Si vous souhaitez garder quoi que ce soit en dehors de celles puis l'ajouter à la classe de caractères à l'intérieur du regex

+0

Malheureusement, cela supprime tous les caractères d'espaces. Ajoutant à cela, les sauts de ligne ne sont pas non plus supprimés, seule la barre oblique car elle n'est pas incluse dans la regex. – Zeliax

+0

maintenant il devrait fonctionner correctement, vérifiez l'espace inclus dans la classe de caractères –

+0

Ouais. Il fonctionne bien maintenant et le texte est _almost_ au besoin, sauf pour une chose. La lettre "n" du "\ n" est toujours dans le texte. – Zeliax

0

pour supprimer '\ n' essayer ....

pour la clé, valeur my_dict.items(): my_dict [key] = '' .join (value.split ('\ n'))

+0

Malheureusement, n'a pas fait l'affaire .. – Zeliax

0

vous devez mettre la valeur mise à jour dans votre dictionnaire (similaire à la situation "par rapport à la référence";)) ...

pour supprimer le «/n » celui-liner peut être plus « pythonique »:

new_test ={ k:v.replace("\n", "") for k,v in test.iteritems()} 

à faire ce que vous essayez de le faire dans votre boucle essayer quelque chose comme:

new_test ={ k:str(value[:10]).replace("\n", " ") for k,v in test.iteritems()} 

Dans votre code, la valeur prend la nouvelle valeur, mais yo Donc, par exemple, cela fonctionnerait (mais soyez plus lent, vous changeriez aussi les valeurs dans la boucle, ce qui ne devrait pas causer de problèmes, mais l'interpréteur ne pourrait pas aimer ...):

for key, value in test.items(): 
    value = str(value[:10]).replace("\n", " ") 
    #now put it back to the dictionary... 
    test[key]=value 
    print key, value