قاموس بيثون: إزالة u 'chars

كيف يمكنني إزالة أحرف u من القاموس التالي؟

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

تأتي هذه البيانات من قاعدة بيانات Mongo Database find()

بحيث يبدو

{'name': 'A', 'primary_key': 1}
34
عندما أستخدم psycopg2 لتنفيذ العبارة فشل ، أفترض أن هذا هو السبب ProgrammingError: 'خطأ في بناء الجملة أو بالقرب من "" "INSERT INTO p_dimension (id ، الاسم) VALUES (1 ، E \' Acro Energy \ ')" "" "\ nLINE 1:" "" INSERT INTO p_dimension (id، name) VALUES (1، E \ 'Acr ... \ n ^ \ n'
وأضاف المؤلف daydreamer, مصدر
وأضاف المؤلف daydreamer, مصدر
تشير الأحرف إلى أن السلاسل سلاسل unicode. هل لديك أي سبب لرغبتك في "إزالتها"؟
وأضاف المؤلف Sven Marnach, مصدر
هذا يبدو الكثير جدا مثل مشكلة مع psycopg2 وليس mongodb ، إذ تضع في اعتبارها هذا هو المكان الخطأ الخاص بك. انشر مثالًا كاملاً مع المشكلة التي تحاول حلها حقًا
وأضاف المؤلف SingleNegationElimination, مصدر
daydreamer ربما يجب عليك نشر الشفرة الفعلية التي تفشل.
وأضاف المؤلف Amber, مصدر

6 إجابة

تتيح لك بعض قواعد البيانات مثل Sqlite3 تحديد المحول و وظيفة المحول حتى يمكنك استرداد النص كـ str بدلاً من unicode . لسوء الحظ ، لا يوفر MongoDB هذا الخيار لأي من الأنواع المطلوبة عادة مثل str أو decimal أو datetime:

بعد إزالة خيارات Mongo ، يترك كتابة رمز Python لإجراء التحويل بعد استرداد البيانات. يمكنك كتابة دالة متكررة تعادل النتيجة لتحويل كل حقل.

كبديل سريع وقذر ، هذا هو الاختراق القليل الذي قد يكون مفيدًا:

>>> import json, ast
>>> r = {u'name': u'A', u'primary_key': 1}
>>> ast.literal_eval(json.dumps(r))
{'name': 'A', 'primary_key': 1}
43
وأضاف

تعني u الأحرف التي تشاهدها ببساطة أنها عبارة عن سلاسل unicode.

إذا كنت لا تريدهم أن يكونوا unicode ، فيمكنك تشفيرهم كشيء آخر ، مثل ASCII.

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

>>> s2 = s.encode('ascii')
>>> s2
'hi'
17
وأضاف

إذا كنت ترغب ببساطة في تحويل العبارة إلى سلسلة بيانات json ، يمكنك القيام بذلك:

>>> from bson.json_util import dumps
>>> data = {u'name': u'A', u'primary_key': 1}
>>> dumps(data)
'{"name": "A", "primary_key": 1}'
3
وأضاف

تحتاج إلى السماح psycopg2 بترميز سلاسلك ، وليس محاولة إدراج سلاسل Python-syntax في استعلاماتك الخام - فأنت تضع نفسك في خطر مشكلة إدخال SQL إذا كانت بعض السلاسل تحتوي على أحرف سيترجمها SQL على أنها تنتهي السلسلة. يجب عليك تمرير المعلمات إلى psycopg2 مثل هذا:

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

لأن psycopg2 يعرف بنية SQL بشكل جيد جدًا ، فإنه سيترك رمز u لأنه يحصل على سلاسل اسم و town وعلامات الاقتباس والتهرب لهم بالضبط بالطريقة التي تحتاجها هذه العبارة SQL.

3
وأضاف

كما ذكرنا سفين في تعليقه ، فإن u هي إشارة إلى الأنواع الممثلة في mongodb (في الواقع ، لأنه يتم تعريف json لاستخدام unicode).

يجب أن تكون هذه الحقيقة شفافة تمامًا بالنسبة لك ، في الحقيقة يمكنك استخدام str و unicode القيم في dicts.

>>> 'foo' in {u'foo': 5}
True
>>> {u'foo': 5}['foo']
5
>>> 
2
وأضاف

لا يمكنك ببساطة إزالة u من السلاسل ، كما يرمز ، أن السلاسل في Unicode.

أحد الحلول هو استخدام وظيفة التشفير:

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

هذا من شأنه أن يتجاهل فقط أحرف non asii.

0
وأضاف