json deserialize в python добавляет дополнительный литерал 'u' [duplicate]

Различия упоминаются достаточно четко в документации array и asarray . Различия заключаются в списке аргументов и, следовательно, действии функции, зависящей от этих параметров.

Определения функций:

numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

и

numpy.asarray(a, dtype=None, order=None)

Следующие аргументы - это те, которые могут быть переданы в array, а не asarray, как указано в документации:

copy: bool, optional Если true (по умолчанию), то объект копируется. В противном случае копия будет сделана только в том случае, если __array__ возвращает копию, если obj является вложенной последовательностью или если требуется копия для удовлетворения любых других требований (dtype, order и т. Д.).

subok: bool, optional If True, тогда подклассы будут переданы, иначе возвращаемый массив будет вынужден быть массивом базового класса (по умолчанию).

ndmin: int, необязательный Задает минимальное количество измерений, которое должен иметь результирующий массив. [1]

будут предварительно отложены до формы, необходимые для выполнения этого требования.

43
задан Ryan 17 April 2009 в 18:22
поделиться

11 ответов

Вы можете использовать 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

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

39
ответ дан dbr 19 August 2018 в 18:31
поделиться
  • 1
    Это так же хорошо, как любой. Настоящий ответ - сосать его! – Ryan 21 April 2009 в 04:49
  • 2
    +1 для меня изучение python 3 строки все unicode по умолчанию – notbad.jpeg 21 June 2012 в 21:58

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

temp = str(row); #str is not necessary, but probably good practice
temp = temp[:-3];
print = temp[3:];
1
ответ дан Agent0 19 August 2018 в 18:31
поделиться

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

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

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

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

turns = json.dumps(turns)

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

26
ответ дан alfasin 19 August 2018 в 18:31
поделиться
  • 1
    Brilliant, json.dumps () - рекурсивный , такой как repr (). Один ключ, словарный словарь преобразуется из int в str. assert '{"3": 5}' == json.dumps({3:5}) (Поскольку идентификаторы свойств объекта JavaScript - все строки.) – Bob Stein 15 July 2016 в 02:02

, используя str( text ), является на самом деле плохой идеей, когда вы не можете быть на 100% уверены в кодировке по умолчанию вашего питона и в точном содержании строки --- последнее было бы типичным для текста, полученного из Интернета. также, в зависимости от того, что вы хотите сделать, использование 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 .

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

< blockquote>

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

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

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

7
ответ дан Community 19 August 2018 в 18:31
поделиться
from __future__ import unicode_literals

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

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

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

5
ответ дан jfs 19 August 2018 в 18:31
поделиться
  • 1
    из future импортировать unicode_literals, не работает в python 2.7 в консоли python – Alex Luya 2 April 2016 в 03:05
  • 2
    @AlexLuya он работает (да, я попробовал, чтобы убедиться). Попробуйте type("") в новом Python REPL, вы увидите <type 'str'>. Затем запустите: from __future__ import unicode_literals и повторите type(""). Теперь вы должны увидеть <type 'unicode'>. Какова ваша среда (ОС, версия python)? – jfs 2 April 2016 в 03:17
  • 3
    Ubuntu + ipython + python 2.7 – Alex Luya 2 April 2016 в 03:39
  • 4
    тип («& quot;») получил «unicode», но «из nltk.corpus import stopwords», затем «print stopwords.words (« english »)», «u» до префикса – Alex Luya 2 April 2016 в 03:43
  • 5
    @AlexLuya работает для меня, и в документах явно указано, что он должен работать: & quot; Будущий оператор, введенный в приглашении интерактивного интерпретатора, вступает в силу для остальной части сеанса интерпретатора. & Quot; – jfs 2 April 2016 в 03:51

Попробуйте следующее

print str (result.url)

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

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

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

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

1
ответ дан Martin 19 August 2018 в 18:31
поделиться
  • 1
    идеально! Благодарю. – Nik 28 April 2011 в 18:16
  • 2
    @Nik: Если это ответили на ваш вопрос, отметьте его как правильный ответ. – XORcist 28 April 2011 в 19:40

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

1
ответ дан Nasser Hadjloo 19 August 2018 в 18:31
поделиться

Кажется, что работает для меня:

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

3
ответ дан tautology 19 August 2018 в 18:31
поделиться

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

3
ответ дан ThomasH 19 August 2018 в 18:31
поделиться

Я знаю, что это не глобальный вариант, но вы также можете подавить 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
ответ дан user 19 August 2018 в 18:31
поделиться
  • 1
    О чувак! Большое спасибо за создание строки «in-array». – itsricky 26 February 2013 в 01:56
  • 2
    Я пытаюсь разбить эти данные на PHP для разбора, и это было soooo confusing, пытаясь обработать это преобразование в PHP. Я потерял 2 года своей жизни. Я использовал «story.append (word)», но я изменил это на ваши магические «story.append» (str (unicode (word))) и все его отсортировано. Блестящий @electrice! – itsricky 26 February 2013 в 01:58
  • 3
    uh, абсолютно ** не делайте этого ** - он потерпит крах с данными, отличными от ASCII, и победит всю цель использования юникода в первую очередь. если вы полагаетесь на то, что у меня нет u, вы делаете что-то ужасное. @itsricky, вы, вероятно, захотите кодировать JSON, не пытаясь разобрать Python в PHP! – Eevee 30 March 2014 в 01:00
  • 4
    Я достиг своего предела, но я должен был поблагодарить тебя, Электрик! – Mona Jalal 1 July 2016 в 09:58
  • 5
    Прекрасно работает!!! – gsamaras 6 September 2016 в 17:10

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

3
ответ дан user3526 19 August 2018 в 18:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: