Подтвердить что ты не робот

Подавить u'prefix, указывающий unicode 'в строках python

Есть ли способ глобально подавить индикатор строки unicode в python? Я работаю исключительно с unicode в приложении и делаю много интерактивных материалов. Наличие u'prefix "появляется во всех моих отладочных выводах, является ненужным и неприятным. Может ли он быть выключен?

4b9b3361

Ответ 1

Вы можете использовать Python 3.0.. Строковый тип по умолчанию - unicode, поэтому префикс u'' больше не требуется.

Короче говоря, нет. Вы не можете отключить это.

u исходит из метода unicode.__repr__, который используется для отображения материала в REPL:

>>> print repr(unicode('a'))
u'a'
>>> unicode('a')
u'a'

Если я не ошибаюсь, вы не можете переопределить это без перекомпиляции Python.

Самый простой способ - просто напечатать строку.

>>> print unicode('a')
a

Если вы используете встроенный unicode() для построения всех своих строк, вы можете сделать что-то вроде.

>>> class unicode(unicode):
...     def __repr__(self):
...             return __builtins__.unicode.__repr__(self).lstrip("u")
... 
>>> unicode('a')
a

.. но не делайте этого, это ужасно

Ответ 2

У меня был случай, когда мне нужно было удалить префикс u, потому что я настраивал javascript с помощью python как часть html-шаблона. Простой выход оставил префикс u для ключей dict, например.

var turns = [{u'armies':2...];

который разбивает javascript.

Чтобы получить необходимый javascript, я использовал модуль json python для кодирования строки для меня:

turns = json.dumps(turns)

Это делает трюк в моем конкретном случае, и поскольку все клавиши являются ascii, нет никакого беспокойства по поводу кодировки. Вероятно, вы можете использовать этот трюк для вывода отладки.

Ответ 3

используя str( text ), является на самом деле плохой идеей, когда вы не можете быть на 100% уверены в вашей кодировке по умолчанию для python и о точном содержании строки --- последнее было бы типичным для текста, полученного из Интернета. также, в зависимости от того, что вы хотите сделать, использование print text.encode( 'utf-8' ) или print repr( text.encode( 'utf-8' ) ) может привести к неутешительным результатам, поскольку вы можете получить рендеринг с нечитаемыми кодовыми точками, такими как \x3a.

Я думаю, что оптимальным является действительно использование командной строки с поддержкой unicode (сложно под Windows, легко под Linux) и переключиться с python 2.x на python 3.x. легкость и ясность обработки текстовых и байтов, предоставляемых новой версией python 3, действительно являются одним из больших выигрышей, которые вы можете ожидать. это означает, что вам придется потратить немного времени на изучение различия между "байтами" и "текстом" и понять концепцию кодировок символов, но тогда это время намного лучше потрачено в среде python 3, поскольку новый подход python к этим неприятные проблемы намного яснее и гораздо меньше подвержены ошибкам, чем предлагал python 2. я бы зашел так далеко, чтобы называть python 2 подход к unicode проблематичным в ретроспективе, хотя я привык думать об этом как о превосходном --- когда я сравнил его с этот вопрос обрабатывается в php.

изменить, я просто остановился на связанном обсуждении здесь, на SO, и нашел этот комментарий о том, как php в эти дни, похоже, решает проблему unicode/вопросы кодирования:

Это как мышь, пытающаяся съесть слон. Обрабатывая Unicode как расширение ASCII (у нас нормальный строки, и у нас есть mb_strings) it получает вещи не так, и на какие особые случаи требуется для работы с символами с смешные сквигглы, которым нужно больше, чем один байт. Если вы рассматриваете Unicode как предоставление абстрактного пространства для любого вам нужен символ ASCII в нем без необходимости рассматривать его как особый случай.

Я цитирую это здесь, потому что, по моему опыту, 90% всех SO python + unicode-тем, похоже, исходят от людей, которые были в порядке с ascii или, может быть, с латинским-1, были укушены случайным персонажем, который не поддерживался в их обычные настройки, а затем в основном просто хотят избавиться от него. что вы делаете при переключении на python 3, именно то, что предлагает вышеперечисленный комментатор: вместо просмотра unicode как досадного расширения ascii вы начинаете рассматривать ascii (и почти любую другую кодировку, которую вы когда-либо встречаете) как подмножество (s ) юникода.

чтобы быть правдой, unicode v6, конечно, не последнее слово в кодировках, но он близок к тому, чтобы быть универсальным, поскольку вы можете привыкнуть к нему.

Ответ 4

Я знаю, что это не глобальный вариант, но вы также можете подавить Unicode u, поместив строку в функцию str().

Итак, список производных Unicode будет выглядеть так:

>>> myList=[unicode('a'),unicode('b'),unicode('c')]
>>> myList
[u'a', u'b', u'c']

станет следующим:

>>> myList=[str(unicode('a')),str(unicode('b')),str(unicode('c'))]
>>> myList
['a', 'b', 'c']

Это немного громоздко, но может быть полезно для кого-то.

Ответ 5

Не уверен в unicode, но обычно вы можете вызвать str.encode(), чтобы преобразовать его в более подходящую форму. Например, вывод подпроцесса, захваченный в Python 3.0+, фиксирует его как поток байтов (префикс "b" ), а encode() исправляет правильную строчную форму.

Ответ 6

from __future__ import unicode_literals

доступен с Python 2.6 (выпущен 1 октября 2008 г.). Он по умолчанию используется в Python 3.

Он позволяет опустить префикс u'' в исходный код, хотя он не меняет repr(unicode_string), который вводит в заблуждение.

Вы можете переопределить sys.displayhook() в Python REPL, чтобы отображать объекты, как вам нравится. Вы также можете переопределить __repr__ для собственных пользовательских объектов.

Ответ 7

На всякий случай вы получаете что-то вроде этого u['hello'], тогда вы должны печатать массив. напечатайте str(arr[0]), и вам хорошо идти.

Ответ 8

Что, кажется, работает для меня:

import ast
import json
j = json.loads('{"one" : "two"}')
j
dd = {u'one': u'two'}
dd
# to get double quotes
json.dumps(j,  encoding='ascii')
json.dumps(dd, encoding='ascii')
# to get single quotes
str(ast.literal_eval(json.dumps(j,  encoding='ascii')))
str(ast.literal_eval(json.dumps(dd, encoding='ascii')))

Вывод:

>>> {u'one': u'two'}
>>> {u'one': u'two'}
>>> '{"one": "two"}'
>>> '{"one": "two"}'
>>> "{'one': 'two'}"
>>> "{'one': 'two'}"

Над работами для словарей и объектов JSON, как само собой разумеющееся.

Для просто строки, wrapping в str(), похоже, работает для меня.

s=u'test string'
s
str(s)

Вывод:

>>> u'test string'
>>> 'test string'

Версия для Python: 2.7.12

Ответ 9

Попробуйте выполнить

print str (result.url)

Возможно, вы изменили кодировку по умолчанию.

Вы можете проверить кодировку по умолчанию следующим образом: -

> import sys
> print sys.getdefaultencoding()
> ascii

По умолчанию должно быть ascii, что означает, что u'string 'должен быть напечатан как "строка", но ваш может быть изменен.

Ответ 10

Вы должны использовать print str(your_Variable)

Ответ 11

В случае, если вы не хотите обновлять Python 3, вы можете использовать подстроки. Например, скажем, что исходный результат был (u'mystring ',). Предположим для примера, что переменная row содержит строку "mystring" без префикса unicode. Затем вы хотели бы сделать что-то вроде этого:

temp = str(row); #str is not necessary, but probably good practice
temp = temp[:-3];
print = temp[3:];