web-dev-qa-db-fra.com

Dictionnaire Python: supprimer les caractères u '

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}
36
daydreamer

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}
45
Raymond Hettinger

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'
17
David Alber

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}'
4
Gopal Gautam

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.

3
Brandon Rhodes

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.

0
Stellarator