Подавить префикс u, указывающий Unicode 'в строках Python - PullRequest
46 голосов
/ 17 апреля 2009

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

Ответы [ 11 ]

40 голосов
/ 17 апреля 2009

Вы можете использовать Python 3.0. Тип строки по умолчанию - Юникод, поэтому префикс 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

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

27 голосов
/ 06 ноября 2012

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

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

, который нарушает JavaScript.

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

turns = json.dumps(turns)

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

8 голосов
/ 11 мая 2015
from __future__ import unicode_literals

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

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

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

7 голосов
/ 30 апреля 2011

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

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

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

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

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

Если быть правдой, Unicode v6, конечно, не последнее слово в кодировках, но оно настолько близко к универсальности, насколько это возможно в 2011 году. Привыкайте к нему.

4 голосов
/ 07 марта 2016

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

4 голосов
/ 18 июля 2009

Я знаю, что это не глобальная опция, но вы также можете подавить 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']

Это немного громоздко, но может пригодиться кому-то

3 голосов
/ 01 августа 2016

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

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, как само собой разумеющиеся.

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

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

Выход:

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

Версия Python: 2.7.12

3 голосов
/ 28 апреля 2011

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

1 голос
/ 25 декабря 2011

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

temp = str(row); #str is not necessary, but probably good practice
temp = temp[:-3];
print = temp[3:];
1 голос
/ 30 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...