Comment puis-je supprimer u chars du dictionnaire suivant?
{u'name': u'A', u'primary_key': 1}
Ces données proviennent de Mongo Database
find () query
pour qu'il ressemble
{'name': 'A', 'primary_key': 1}
Certaines bases de données telles que Sqlite3 vous permettent de définir les fonctions converter et adapter afin de pouvoir récupérer le texte sous la forme str plutôt que unicode. Malheureusement, MongoDB ne fournit cette option pour aucun des types couramment utilisés tels que str, decimal ou datetime:
Une fois les options Mongo éliminées, il reste du code Python à écrire pour effectuer la conversion après la récupération des données. Vous pourriez écrire une fonction récursive qui parcourt le résultat pour convertir chaque champ.
Comme alternative rapide et sale, voici un petit hack qui pourrait être utile:
>>> import json, ast
>>> r = {u'name': u'A', u'primary_key': 1}
>>> ast.literal_eval(json.dumps(r))
{'name': 'A', 'primary_key': 1}
Les caractères u
que vous voyez signifient simplement qu'il s'agit de chaînes unicode.
Si vous ne voulez pas qu’ils soient unicode, vous pouvez les encoder autrement, comme ASCII.
>>> s = u'hi!'
>>> s
u'hi'
>>> s2 = s.encode('ascii')
>>> s2
'hi'
Si vous voulez simplement convertir le dict en json data string, vous pouvez faire:
>>> from bson.json_util import dumps
>>> data = {u'name': u'A', u'primary_key': 1}
>>> dumps(data)
'{"name": "A", "primary_key": 1}'
Vous devez laisser psycopg2 encoder vos chaînes et non essayer d’insérer des chaînes de syntaxe Python dans vos requêtes brutes - vous vous exposez à un problème d’injection SQL si certaines chaînes contiennent des caractères que SQL interprétera comme mettant fin à la chaîne. Vous devriez passer les paramètres à psycopg2 comme ceci:
cursor.execute('INSERT INTO person (name, town) VALUES (%s %s)', (name, town))
Parce que psycopg2 connaît très très bien la syntaxe SQL, il laissera les caractères u
lorsqu’il récupère vos chaînes name
et town
et les cite et les échappe exactement de la manière dont cette instruction SQL a besoin.
Comme Sven le mentionne dans son commentaire, la variable u
est une indication des types représentés dans mongodb (en réalité c'est parce que json est défini pour utiliser unicode).
Ce fait devrait être totalement transparent pour vous. En fait, vous pouvez utiliser les valeurs str
et unicode
de manière interchangeable dans les dicts.
>>> 'foo' in {u'foo': 5}
True
>>> {u'foo': 5}['foo']
5
>>>
Vous ne pouvez pas simplement supprimer le u des chaînes, car il symbolise que les chaînes sont en Unicode.
Une solution consiste à utiliser la fonction encoder:
old_strings = {u'name':u'A', u'primary_key':1}
newstrings = {}
for k in old_strings.keys():
newtsrings[k] = old_strings[k].encode('ascii','ignore')
Cela ignorerait simplement les caractères non ascii.