Как вы можете напечатать строку, используя кодировку raw_unicode_escape в Python 3? - PullRequest
2 голосов
/ 14 июня 2010

Следующий код с ошибкой в ​​Python 3.x с TypeError: must be str, not bytes, потому что теперь encode() возвращает bytes, а print() ожидает только str.

#!/usr/bin/python
from __future__ import print_function
str2 = "some unicode text"
print(str2.encode('raw_unicode_escape'))

Как вы можете напечататьСтрока в кодировке Юникод экранирована с использованием print()?Я ищу решение, которое будет работать с Python 2.6 или новее, включая 3.x

Update

Ниже строка будет работать с 3.x, но не будет работать с 2.6, генерируяAttributeError: 'file' object has no attribute 'buffer'

sys.stdout.buffer.write(str2.encode('raw_unicode_escape'))

Ответы [ 3 ]

5 голосов
/ 14 июня 2010

Я бы просто использовал:

print(str2.encode('raw_unicode_escape').decode('ascii'))

, если вам нужен идентичный код в Python 3 и Python 2.6 (в противном случае вы можете использовать repr в 2.6 и ascii в Python 3, но это не совсем "идентично"; -).

1 голос
/ 14 июня 2010

Я не могу воспроизвести вашу проблему, пожалуйста, посмотрите предыдущие редакции этого ответа для журнала моих попыток (который объясняет мою ссылку в комментариях).

Тем не менее:

Кажется, что вы пытаетесь принудительно кодировать при записи в файл, выполняя всю работу самостоятельно. Однако в Python 3 open() принимает параметр encoding, который делает всю магию за вас.

badp@delta:~$ python3
Python 3.1.2 (r312:79147, Apr 15 2010, 12:35:07) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> foo = open("look mah, utf-32", "w", encoding="utf-32")
>>> foo.write("bar")
3
>>> foo.close()
>>> foo = open("look mah, utf-32", "rb")
>>> foo.read()
b'\xff\xfe\x00\x00b\x00\x00\x00a\x00\x00\x00r\x00\x00\x00'

Если вы ищете эквивалент Python 2, похоже, что вы действительно хотите использовать io.open().

0 голосов
/ 14 июня 2010

http://docs.python.org/py3k/library/functions.html#ascii

В качестве repr () возвращает строку, содержащую печатаемое представление объекта, но экранирует не-ASCII-символы в строке, возвращаемой repr (), используя escape-символы \ x, \ u или \ U. Это генерирует строку, аналогичную той, которая возвращается repr () в Python 2.

И полученная строка действительно будет иметь тип str, а не bytes.

Пример:

>>> a = '''Ⴊ ⇠ ਐ ῼ இ ╁ ଠ ୭ ⅙ ㈣'''
>>> ascii(a)
"'\\u10aa \\u21e0 \\u0a10 \\u1ffc \\u0b87 \\u2541 \\u0b20 \\u0b6d \\u2159 \\u3223'"
>>> print(ascii(a))
'\u10aa \u21e0 \u0a10 \u1ffc \u0b87 \u2541 \u0b20 \u0b6d \u2159 \u3223'

А если вы хотите обрезать лишние кавычки, вы можете просто сделать print(ascii(a)[1:-1]).

РЕДАКТИРОВАТЬ: Как утверждает Алекс, вам придется использовать repr в Python 2.6 вместо ascii. Его решение действительно работает как для Python 2, так и для 3, но если вы планируете многократно выполнять преобразование (и, следовательно, предпочли бы что-то более простое набирать несколько раз), одна из возможностей состоит в том, чтобы поставить условие в начале вашей программы следующим :

import sys
if sys.version_info[0] == 3:
    unic = ascii
else:
    unic = repr

И затем вы просто используете unic (или как хотите, чтобы его называть) везде, где бы вы использовали repr в Python 2 и ascii в Python 3.

... Хотя я полагаю, вы могли бы использовать elif sys.version_info[0] == 2: вместо else:, если хотите быть немного осторожнее.

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