初学者求助,关于转义符 \b

2021-01-18 10:55:58 +08:00
 boell

在 vs code 中,运行以下 py 文件: print('aaa\b\b\b') 终端输出‘aaa’三个字符。

如果把代码改成: print('aaa\b\b\b',end='') 则什么都不输出(或者说先输出 aaa,然后被退格删除了)

这里面的逻辑如何理解?

2838 次点击
所在节点    Python
22 条回复
imn1
2021-01-18 11:27:08 +08:00
你不是都理解了么?你想问什么?
est
2021-01-18 11:30:26 +08:00
这个不是 python 问题。是 终端 的显示问题。。

你执行 python 的时候改成 python xxxx.py | xxd 看下二进制输出就明白了。
boell
2021-01-18 13:00:00 +08:00
@imn1
我就是没明白啊!按我理解,\b 只是退格,本身没有删除功能。print('aaa\b\b\b') 就是先输出 aaa,光标再退 3 格,然后换行,所以最终输出 aaa 。按照这个理解,print('aaa\b\b\b',end='') 也应该输出 aaa 啊,怎么都被清除了?
boell
2021-01-18 13:01:11 +08:00
@est
不是很明白你说的二进制输出。我只会 python xxx.py 2>&1 | tee a.log 这样的写法。
kxuanobj
2021-01-18 13:07:49 +08:00
@boell 少加一个\b 你就知道了
boell
2021-01-18 13:11:40 +08:00
@kxuanobj
少一个\b,仍然输出 aaa,这个我能理解啊。
renmu123
2021-01-18 13:17:24 +08:00
用 cmd 打开 ipython,两者都输出 aaa
canwushuang
2021-01-18 13:37:47 +08:00
print 输出“光标”前面的内容,加入 end 参数则输出拼接内容。\b 即光标退格。
canwushuang
2021-01-18 13:42:21 +08:00
By default, the value of the 'end' parameter is '\n'.
araraloren
2021-01-18 13:51:36 +08:00
这东西跟你用的终端有关系。。
cmd 的话 都输出 aaa,只不过第二种没有换行
ps 的话第二种没输出
AoEiuV020
2021-01-18 14:20:07 +08:00
还真没注意过这个,总之和 python,直接 shell 情况也一样,想了解应该看终端 terminal 源码,可能有什么相关规范,
gyf304
2021-01-18 14:23:18 +08:00
Backspace (BS) 是一个 ASCII 字符 这个现象和 python 半毛钱关系都没有
Backspace 是由 Terminal 处理的,python 单纯只是把这些字符输出到终端上了

所以你的问题应该是:为什么我的终端接收到 'aaa\b\b\b\n' 输出 'aaa',但是接收到 'aaa\b\b\b' 什么都不输出

我觉得你不用太纠结这些问题 真要纠结的话可以参考 https://zh.wikipedia.org/wiki/ANSI%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97
AoEiuV020
2021-01-18 14:26:16 +08:00
试了试,按我理解,输出都一样输出了,
只不过没有换行的情况下一条命令的 Prompt 会覆盖退格键之后的内容,
换行的话,Prompt 就打印在下一行了,不影响上一行退格的文字,
bleepbloop
2021-01-18 14:32:58 +08:00
print('aaa\b\b\b',end='') 输出: aaa
print('aaa\b\b\b',end=' ') 输出: aa
print('aaa\b\b\b',end=' ') 输出: a
print('aaa\b\b\b',end=' ') 输出:
evadegame
2021-01-18 14:43:39 +08:00
'\b' 一般只能退格,不带删除功能。要实现删除效果需要输出 "\b \b", 先退格,然后打印空格,然后再退格。
evadegame
2021-01-18 14:47:30 +08:00
print("aaa\b\b\b", end='') 会先打印 aaa,然后终端会从一行开头打印一些字符覆盖 aaa,如果你的 aaa...和\b\b\b...足够长,还可以看到没被覆盖的内容。
Pagliacii
2021-01-18 15:28:59 +08:00
你可以简单地做个试验就知道了,代码如下图:

![image.png]( https://i.loli.net/2021/01/18/HkvliUAIu1CMrxg.png)
Pagliacii
2021-01-18 15:36:36 +08:00
@Pagliacii #17 Backspace ("\b") 的作用是把光标往回退,来自于控制打印机的打印头回退的行为。而 Newline ("\n") 则是把光标移动到下一行。

至于你的问题则是,没有 Newline 的输出时,光标在 "aaa" 的前边。而后续的终端提示字符就在目前光标所在位置输出了,从而导致 "aaa" 被提示字符给覆盖了。

而有 Newline 时,由于光标此时位于 "aaa" 的下一行,终端提示字符输出时就不会覆盖 "aaa" 了
XIVN1987
2021-01-18 15:54:27 +08:00
我觉得楼上 @evadegame @Pagliacii 说的是对的

关键就是\b 只退格、不删除,,试下 print('aaaaaa\b\b\b\b\b\b',end='')会发现,,输出是“>>> aa”,就是因为退格到了行首,然后输出了“>>> ”四个字符把前四个 a 给覆盖了,,就只剩下了最后两个 a 了
Pagliacii
2021-01-18 16:00:22 +08:00
@Pagliacii #18 这里的“打印机”应该是“打字机”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/745822

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX