暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关于回车与换行

生有可恋 2023-03-07
1239

回车和换行分别代表的是不同的字符,回车为'\r',换行为'\n‘,它们都属于不可见字符,也称为控制字符。它们在终端显示中的作用是不同的。

比如以下效果就是使用回车符和换行符不同的特性来实现的:

回车符'\r'的作用是使光标回到当前行的首行,换行符'\n'的作用是切换至下一行的行首。

以上效果的代码如下:

    #!python3


    import time
    import sys


    def clean():
    global N
    for i in range(N):
    print('\033[A\r', end='')
    print('❌'*40, end='\r')
    time.sleep(0.03)
    sys.stdout.flush()




    def demo():
    global buffer
    for i in buffer:
    print(i)
    time.sleep(0.1)
    sys.stdout.flush()




    if __name__ == '__main__':


    N = 25
    buffer = []
    for i in range(N):
    s = '✅'*40
    buffer.append(s)


    print()
    while True:
    demo()
    time.sleep(0.1)
    clean()

    我们平常使用的多的是换行符'\n',终端显示中换行符可以起到回车的作用,即让光标回到下一行的行首。单独使用回车符'\r',会让光标回到当前行的行首,此时如果输出其它字符会覆盖当前行的其它内容。

    比如如下代码是在当前行重复输出:

      #!python3


      print('##########', end='')
      print('\r', end='')
      print('xxxxxxx', end='')
      print('\r', end='')
      print('$$$')

      最终输出为:

        $$$xxxx###

        使用回车符'\r'可以让输入点回到行首,从而覆盖其它内容。换行符’\n'让光标切换到下一行的行首。而控制字符串'\033[A'可以让光标回到上一行,配合回车符'\r'可以覆盖上一行的内容。通过多次回退可以实现向上覆盖,即以上代码演示的效果。

        控制字符串'\033[A'只对终端有效,而'\r'和'\n'在文本文件中也有使用,不同的操作系统对回车和换行的使用并不一致。Linux系统一般只使用'\n'作为换行符,而Windows系统会使用'\r\n'作为换行符。

        我们在notepad中保存的文本文件,通过python的文件操作打开后可以看到回车和换行符。

          Python 3.11.0rc2 (main, Sep 11 2022, 20:22:52) [MSC v.1933 64 bit (AMD64)] on win32
          Type "help", "copyright", "credits" or "license" for more information.
          >>> ord('\r')
          13
          >>> ord('\n')
          10
          >>> f = r'd:\test.txt'
          >>> t = open(f,mode='rb')
          >>> t
          <_io.BufferedReader name='d:\\test.txt'>
          >>> t.read()
          b'aaa\r\n'

          回车符'\r'的经典用法是使用它来制作进度条:

            #!python3


            import sys
            import time


            def do_something():
            pass


            def bar_update(rate):
            print("当前进度: {:3d}%".format(rate), "▋" * (rate 2), end="\r")
            sys.stdout.flush()
            time.sleep(0.05)




            if __name__ == '__main__':
            n = 0
            while True:
            do_something()
            bar_update(n)
            n += 1
            if n == 100:
            n = 0
            print('\r'+' '*65, end='\r')

            全文完。

            如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。

            文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论