python print() 函数实际上是做什么的?

2024-04-26

我正在看这个question https://stackoverflow.com/questions/1979171/how-can-i-escape-xff-xfe-to-a-readable-string并开始想知道什么是print实际上确实如此。

我一直不知道如何使用string.decode() and string.encode()在 python 交互式 shell 中以与 print 相同的格式获取 unicode 字符串“out”。无论我做什么,我都会得到

  1. UnicodeEncodeError 或
  2. 带有“\x##”符号的转义字符串...

这是 python 2.x,但我已经在尝试改进我的方式并实际调用print() :)

Example:

>>> import sys
>>> a = '\xAA\xBB\xCC'
>>> print(a)
ª»Ì
>>> a.encode(sys.stdout.encoding)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0xaa in position 0: ordinal not in range(128)
>>> a.decode(sys.stdout.encoding)
u'\xaa\xbb\xcc'

EDIT:

我为什么要问这个?我厌倦了encode()错误并意识到自从print可以做到(至少在交互式 shell 中)。我知道一定有办法神奇地进行编码PROPERLY,通过从某处挖掘要使用什么编码的信息......

附加信息: 我在 linux2 上运行 Python 2.4.3 (#1, Sep 3 2009, 15:37:12) [GCC 4.1.2 20080704 (Red Hat 4.1.2-46)]

>>> sys.stdin.encoding
'ISO-8859-1'
>>> sys.stdout.encoding
'ISO-8859-1'

然而,在同一个 Linux 机器上,结果与 Python 2.6.2 (r262:71600, Sep 8 2009, 13:06:43) 相同。


EDIT:(此编辑与上一个编辑之间的主要变化...注意:我在 Ubuntu 机器上使用 Python 2.6.4。)

首先,在我第一次尝试回答时,我提供了一些一般信息print and str我将把它留在下面,以方便任何遇到更简单问题的人print并偶然想到这个问题。至于处理OP遇到的问题的新尝试......基本上,我倾向于说这里没有灵丹妙药,如果print以某种方式设法理解奇怪的字符串文字,那么这不是可重现的行为。我通过终端窗口中与 Python 的以下有趣交互得出了这个结论:

>>> print '\xaa\xbb\xcc'
��

您是否尝试过直接从终端输入ª»Ì?在使用 utf-8 作为编码的 Linux 终端上,这实际上是作为 6 个字节读取的,然后可以借助以下命令使其看起来像三个 unicode 字符:decode method:

>>> 'ª»Ì'
'\xc2\xaa\xc2\xbb\xc3\x8c'
>>> 'ª»Ì'.decode(sys.stdin.encoding)
u'\xaa\xbb\xcc'

So, the '\xaa\xbb\xcc'文字只有在解码时才有意义作为 latin-1 文字(好吧,实际上您可以使用与相关字符上的 latin-1 一致的不同编码)。至于print在你的情况下“只是工作”,它当然不适合我 - 如上所述。

这是因为当您使用不带前缀的字符串文字时u- IE。"asdf"而不是u"asdf"-- 生成的字符串将使用一些非 unicode 编码。不;事实上,字符串对象本身是不知道编码的,并且您必须将其视为使用编码 x 进行编码,以获得正确的 x 值。这个基本想法使我得出以下结论:

a = '\xAA\xBB\xCC'
a.decode('latin1')
# result: u'\xAA\xBB\xCC'
print(a.decode('latin1'))
# output: ª»Ì

请注意,没有解码错误和正确的输出(我希望在任何其他盒子上都能保持正确的输出)。显然,Python 可以理解你的字符串文字,但需要一些帮助。

这有帮助吗? (至少在理解事情是如何工作的方面,如果不是让编码的处理变得更容易的话......)


现在来看一些具有解释价值的有趣片段(希望如此)!这对我来说效果很好:

sys.stdout.write("\xAA\xBB\xCC".decode('latin1').encode(sys.stdout.encoding))

跳过解码或编码部分会导致与 unicode 相关的异常。从理论上讲,这是有道理的,因为需要第一次解码来决定给定字符串中有哪些字符(乍一看唯一明显的是bytes有——Python 3 的想法是用(unicode)字符串表示字符,用字节表示字节,突然间似乎非常合理),同时需要编码,以便输出尊重输出流的编码。现在这个

sys.stdout.write("ąöî\n".decode(sys.stdin.encoding).encode(sys.stdout.encoding))

也按预期工作,但字符实际上来自键盘,因此实际上是使用 stdin 编码进行编码的...此外,

ord('ą'.decode('utf-8').encode('latin2'))

返回正确的 177 (我的输入编码是 utf-8),但是 '\xc4\x85'.encode('latin2') 对 Python 没有任何意义,因为它不知道如何理解 '\xc4\ x85' 并认为尝试'ascii' 代码是它能做的最好的事情。


原答案:

相关位 http://docs.python.org/library/functions.html#printPython 文档(版本 2.6.4)说print(obj)是为了打印出由给出的字符串str(obj)。我想你可以把它包装在一个电话中unicode (as in unicode(str(obj)))来获取 unicode 字符串——或者您可以只使用 Python 3 并将这个特定的麻烦替换为几个不同的字符串。 ;-)

顺便说一句,这表明您可以操纵结果print调用一个对象就像操作调用的结果一样str在一个物体上,即通过弄乱__str__方法。例子:

class Foo(object):
    def __str__(self):
        return "I'm a Foo!"

print Foo()

至于实际执行情况print,我预计这根本没有用,但如果你really想知道发生了什么......它在文件中Python/bltinmodule.c在 Python 源代码中(我正在查看版本 2.6.4)。搜索以以下内容开头的行builtin_print。实际上,这非常简单,没有任何魔法。 :-)

希望这能回答您的问题...但是,如果您确实有一个我完全忽略的更神秘的问题,请发表评论,我将进行第二次尝试。另外,我假设我们正在处理 Python 2.x;否则我想我不会有有用的评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python print() 函数实际上是做什么的? 的相关文章

  • 为什么Python有最大递归深度?

    Python有最大递归深度 但没有最大迭代深度 为什么递归受到限制 把递归当成迭代来对待 而不限制递归调用的次数不是更自然吗 我只想说这个问题的根源来自于尝试实现流 参见这个问题 https stackoverflow com questi
  • ipdb 和 pdb++ 之间的区别?

    Python 有一个名为 pdb 的默认调试器 但社区创建了一些替代品 其中两个是ipdb https github com gotcha ipdb and pdb https github com pdbpp pdbpp 它们似乎迎合了相
  • 美丽的汤从谷歌搜索中提取href

    谷歌搜索给出了以下 HTML 的第一个结果 h3 class r a href https rads stackoverflow com amzn click com 0470284889 class l vst em Quantitati
  • Pyenv 无法在 Cygwin 上安装 python: ModuleNotFoundError: No module named '_ctypes'

    我正在尝试设置 Cygwin 环境以使用 pyenv 来管理 python 版本 我没有管理员权限 所以我使用以下命令运行设置 no admin flag 我使用 Cygwin 包管理器应用程序解决了一些依赖关系 但我被困在了这一点上 Mo
  • Pip install 导致此错误“ cl.exe' failed with exit code 2 ”

    我已经阅读了有关此错误的所有其他问题 但令人沮丧的是 没有一个给出有效的解决方案 如果我跑pip install sentencepiece在命令行中 它给出了以下输出 src sentencepiece sentencepiece wra
  • 无法在 mysql 表中的值中使用破折号(-)[重复]

    这个问题在这里已经有答案了 我一直在尝试从 python 将数据插入 MYSQL 表 我的sql表中的字段是id token start time end time和no of trans 我想存储使用生成的令牌uuid4在令牌栏中 但由于
  • 如何在Python中的BeautifulSoup4中使用.next_sibling时忽略空行

    由于我想删除 html 网站中重复的占位符 因此我使用 BeautifulSoup 的 next sibling 运算符 只要重复项位于同一行 就可以正常工作 参见数据 但有时它们之间有一个空行 所以我希望 next sibling 忽略它
  • 十六进制数的按位异或

    我们如何在 Python 中对十六进制数进行异或 例如 我想要异或 ABCD and 12EF 答案应该是 B922 我使用了下面的代码 但它给出了错误的结果 xor two strings of different lengths def
  • Python 字典 - 在 2 个字符的字符串中查找第二个字符,该字符产生最小值

    我想提交密钥的第一部分并返回该密钥的剩余部分 以最小化值 并从第一部分开始 例如 d ab 100 ac 200 ad 500 如果我要进去 a I would like to return b min d s s for s in d i
  • 在函数调用之间保存数据的Pythonic方式是什么?

    对我来说 上下文是我需要在调用修改该值的函数之间保留的单个 int 的信息 我可以使用全局 但我知道这是不鼓励的 现在 我使用了包含 int 的列表形式的默认参数 并利用了可变性 以便在调用之间保留对值的更改 如下所示 def increm
  • 在ansible中合并字典

    我目前正在构建一个使用 ansible 安装 PHP 的角色 并且在合并字典时遇到一些困难 我尝试了多种方法来做到这一点 但我无法让它像我想要的那样工作 A vars file my default values key value my
  • Floyd-Warshall 算法:获取最短路径

    假设一个图由一个表示n x n维数邻接矩阵 我知道如何获得所有对的最短路径矩阵 但我想知道有没有办法追踪所有最短路径 Blow是python代码实现 v len graph for k in range 0 v for i in range
  • 管理文件字段当前 url 不正确

    在 Django 管理中 只要有 FileField 编辑页面上就会有一个 当前 框 其中包含指向当前文件的超链接 但是 此链接会附加到当前页面 url 因此会导致 404 因为不存在这样的页面 例如 http 127 0 0 1 8000
  • 如何在matplotlib中基于x轴更改直方图颜色

    我有根据 pandas 数据框计算出的直方图 我想根据 x 轴值更改颜色 例如 If the value is 0 the color should be green If the value is gt 0 the color shoul
  • 如何在 Python 中仅列出 zip 存档中的文件夹?

    如何仅列出 zip 存档中的文件夹 这将列出存档中的每个文件夹和文件 import zipfile file zipfile ZipFile samples sample zip r for name in file namelist pr
  • 如何使用数据库在 Django 中的应用程序之间交换数据?

    我正在使用 Django 在网络上工作 我创建了 2 个应用程序 第一个用于客户端注册并将其数据添加到数据库 第二个应用程序供用户访问和查看交互界面 这个想法是使用第二个应用程序从数据库中的客户端获取数据 并使用它向用户显示一些信息 我的问
  • Jupyter Notebook 中的多处理与线程

    我试图测试这个例子here https ipywidgets readthedocs io en stable examples Widget 20Asynchronous html将其从线程更改为多处理 在 jupyter Noteboo
  • 测试中的模型 - Django 1.7 问题

    我正在尝试将我的项目移植为使用 Django 1 7 除了一件事之外 一切都很好 测试文件夹内的模型 Django 1 7 新迁移在内部运行 migrate 命令 在运行syncdb之前 这意味着如果模型未包含在迁移中 它将不会填充到数据库
  • 在Python中从列表中获取n个项目组的惯用方法? [复制]

    这个问题在这里已经有答案了 给定一个列表 A 1 2 3 4 5 6 是否有任何惯用的 Pythonic 方式来迭代它 就好像它是 B 1 2 3 4 5 6 除了索引之外 这感觉像是 C 的遗留物 for a1 a2 in A i A i
  • Shap - 颜色条不显示在摘要图中

    显示summary plot时 不显示颜色条 shap summary plot shap values X train 我尝试过改变plot size 当绘图较高时 会出现颜色条 但它非常小 看起来不应该 shap summary plo

随机推荐