Python-woordenboek: u 'chars verwijderen'

Hoe verwijder ik u tekens uit het volgende woordenboek?

{u'name': u'A', u'primary_key': 1}  

Deze gegevens komen uit de Mongo-database find() -query

zodat het eruit ziet

{'name': 'A', 'primary_key': 1}
34
wanneer ik psycopg2 gebruik om een ​​statement uit te voeren, mislukt het, ik neem aan dat dit de reden is ProgrammingError: 'syntax error at of near "" "" INSERT INTO p_dimension (id, name) VALUES (1, E \' Acro Energy \ ') " "" "\ nLINE 1:" "" INVOEGEN IN p_dimension (id, naam) VALUES (1, E \ 'Acr ... \ n ^ \ n'
toegevoegd de auteur daydreamer, de bron
toegevoegd de auteur daydreamer, de bron
De tekens geven aan dat de reeksen unicode-reeksen zijn. Heb je een reden om ze te willen "verwijderen"?
toegevoegd de auteur Sven Marnach, de bron
Dit klinkt ontzettend veel als een probleem met psycopg2 en niet mongodb, aangezien je fout daar is. Post een volledig voorbeeld met het probleem dat je echt probeert op te lossen
toegevoegd de auteur SingleNegationElimination, de bron
@daydreamer Je zou waarschijnlijk de echte code moeten posten die faalt.
toegevoegd de auteur Amber, de bron

6 antwoord

Met sommige databases, zoals Sqlite3, kunt u converter en adapter functies, zodat u tekst kunt ophalen als str in plaats van unicode . Helaas biedt MongoDB deze optie niet voor de veelgebruikte typen zoals str, decimal of datetime:

Na het elimineren van Mongo-opties, blijft het schrijven van Python-code over om de conversie uit te voeren nadat de gegevens zijn opgehaald. U zou een recursieve functie kunnen schrijven die het resultaat doorloopt om elk veld te converteren.

Als snel en vies alternatief is hier een kleine hack die van pas kan komen:

>>> import json, ast
>>> r = {u'name': u'A', u'primary_key': 1}
>>> ast.literal_eval(json.dumps(r))
{'name': 'A', 'primary_key': 1}
43
toegevoegd

De u tekens die u ziet, betekenen eenvoudigweg dat dit unicode-reeksen zijn.

Als u niet wilt dat ze unicode zijn, kunt u ze coderen als iets anders, zoals ASCII.

>>> s = u'hi!'
>>> s
u'hi'

>>> s2 = s.encode('ascii')
>>> s2
'hi'
17
toegevoegd

Als u eenvoudig de dict wilt converteren naar json-gegevensreeks, kunt u het volgende doen:

>>> from bson.json_util import dumps
>>> data = {u'name': u'A', u'primary_key': 1}
>>> dumps(data)
'{"name": "A", "primary_key": 1}'
3
toegevoegd

Je moet psycopg2 je strings laten coderen, niet proberen om Python-syntaxis-strings ruw in te voegen in je query's - je brengt jezelf in gevaar van een SQL-injectieprobleem als sommige strings tekens bevatten die SQL interpreteert als het einde van de string. Je moet parameters als volgt aan psycopg2 doorgeven:

cursor.execute('INSERT INTO person (name, town) VALUES (%s %s)', (name, town))

Omdat psycopg2 de SQL-syntax heel goed kent, zal het de u tekens laten staan ​​omdat het uw naam en stad strings en citaten en escapes krijgt op precies dezelfde manier als deze SQL-instructie nodig heeft.

3
toegevoegd

Zoals sven in zijn opmerking vermeldt, is de u een indicatie van de typen die worden weergegeven in mongodb (eigenlijk komt het omdat json is gedefinieerd om unicode te gebruiken).

Dit feit zou volledig transparant voor u moeten zijn, in feite kunt u str en unicode waarden uitwisselbaar in de dictaten gebruiken.

>>> 'foo' in {u'foo': 5}
True
>>> {u'foo': 5}['foo']
5
>>> 
2
toegevoegd

Je kunt niet zomaar de u uit de strings verwijderen, omdat dit symboliseert, dat de strings zich in Unicode bevinden.

Een oplossing is om de coderingsfunctie te gebruiken:

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')

Dit zou niet-ascii tekens negeren.

0
toegevoegd