V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
520Python
V2EX  ›  Python

Pycharm 中制表符输出无法对齐,这个怎么解决啊?

  •  
  •   520Python · 2019-12-27 10:44:36 +08:00 · 6546 次点击
    这是一个创建于 1553 天前的主题,其中的信息可能已经有所发展或是发生改变。
    直接上代码吧:
    print("number\tSquare\tCube")
    for i in range (1,11):
    print(i,"\t",i**2,"\t",i**3)
    其中表头和输出都有制表符,输出就无法对齐:
    number Square Cube
    1 1 1
    2 4 8
    3 9 27
    4 16 64
    5 25 125
    6 36 216
    7 49 343
    8 64 512
    9 81 729
    10 100 1000
    22 条回复    2019-12-27 18:22:09 +08:00
    520Python
        1
    520Python  
    OP
       2019-12-27 10:49:05 +08:00
    wuwukai007
        2
    wuwukai007  
       2019-12-27 10:50:38 +08:00 via Android
    403
    520Python
        3
    520Python  
    OP
       2019-12-27 10:54:54 +08:00
    @wuwukai007 图片链接打开 403 吗?我点开正常打开呢
    BingoXuan
        4
    BingoXuan  
       2019-12-27 10:55:13 +08:00
    换个思路,通过使用 str.ljust 来对齐。我一直没搞懂\t 的输出规律

    for i in range (1,11):
    print(''.join([str(x).ljust(10) for x in [i,i**2,i**3]]))
    ipwx
        5
    ipwx  
       2019-12-27 10:58:05 +08:00   ❤️ 1
    你是不是对制表符有什么误解?

    制表符的作用只是相当于填充空格,至少填充空格,至多填充空格到下一个光标位置为某个数的整倍数。你这张图看上去 PyCharm 是把它填充为 4 个空格的整倍数。

    print(a, b) 这句话,a 和 b 之间本来就会有一个固定的空格。所以你 "\t",i**2,"\t",这里就会是 "\t {number} \t"。比如你那一行,4 \t 16 \t 64 \t 4,你看如果 16 前面的空格是 4 的整倍数列开始的字符,那么 16 加上后面的空格已经占据了第二个 4 的整倍数区域。\t 会让它直接输出 4 个空格占据第三个 4 的整倍数区域。。。所以和上面无法对齐。

    用制表符对齐命令行输出基本没戏。你得用更高级的包,比如 terminaltables。
    wy9899
        6
    wy9899  
       2019-12-27 10:59:30 +08:00
    请使用占位符
    ipwx
        7
    ipwx  
       2019-12-27 11:03:37 +08:00
    @BingoXuan lstrip 还不如格式化输出

    print('Number Square Cube')
    for i in range(1, 11):
    ....print(f'{str(i):<8s}{str(i**2):<8s}{str(i**3)}')

    ipwx
        8
    ipwx  
       2019-12-27 11:04:39 +08:00
    上面写错了,ljust 不如格式化输出
    520Python
        9
    520Python  
    OP
       2019-12-27 11:06:17 +08:00
    520Python
        10
    520Python  
    OP
       2019-12-27 11:06:39 +08:00
    我直接在命令行执行代码,正常展示: https://upload-images.jianshu.io/upload_images/12134160-2233a1b0126cb7d0.jpg
    lolizeppelin
        11
    lolizeppelin  
       2019-12-27 11:09:06 +08:00
    去参考 prettytable 怎么写的
    ipwx
        13
    ipwx  
       2019-12-27 11:22:29 +08:00
    @520Python 这哪里正常了,你没发现数字和表头没对齐么。。。

    请重新阅读一下我的话。\t 的作用是对齐到某个数的整倍数。不同应用程序,这个数不一样,PyCharm 是 4,而 cmd.exe 是 8。带入 8 这个数你重新计算一下。
    520Python
        14
    520Python  
    OP
       2019-12-27 11:24:30 +08:00
    @ipwx 只是稍微比 Pycharm 里好看点^_^
    BingoXuan
        15
    BingoXuan  
       2019-12-27 11:31:03 +08:00
    @ipwx
    其实思路都是一样,都是通过填充空白字符使得最终输出字符串长度固定实现对齐。只是看到 lz 范例输出是左对齐就想到 ljust 的 api。代码可读性来看,格式化输出更好。

    @520Python
    terminal 在输出制表符时候的行为好像是有点不一样的。所以填充空白字符使得最终输出字符串长度固定是最稳妥的办法。
    lolizeppelin
        16
    lolizeppelin  
       2019-12-27 11:41:49 +08:00
    制表符靠谱 python 就不会用 4 空格了
    制表符不靠谱又不是 python 的锅

    无论什么语言写对齐都要算字符宽度然后填充空格
    中文字符宽度还要麻烦一点
    daimiaopeng
        17
    daimiaopeng  
       2019-12-27 12:20:59 +08:00 via Android
    print("%4s" %num)
    jin7
        18
    jin7  
       2019-12-27 13:45:43 +08:00
    @ipwx #7
    for i in range(1, 11):
    ....print(f'{str(i):<8}{str(i**2):<8}{str(i**3)}')
    s 貌似可以去掉
    jin7
        19
    jin7  
       2019-12-27 13:53:28 +08:00
    中间对齐

    for i in range(1, 11):
    print(f'{str(i):^8}{str(i**2):^8}{str(i**3):^8}')

    https://docs.python.org/3.8/library/string.html
    no1xsyzy
        20
    no1xsyzy  
       2019-12-27 14:51:53 +08:00
    @lolizeppelin 制表符在用于 indentation 的时候还是挺靠谱的,不管 4 还是 8 都很整齐
    并且还可以根据屏幕大小同代码不同 indentation 距离(看过博客提出这个问题来决定还是采用 Tab indent )
    Python 的问题好像是代码格式化时除了 indentation 还时不时需要 alignment,所以还是空格好 —— 当然,这是拍脑袋瞎猜,我没去查 PEP 说为什么这么来。

    中文字符已经是比较简单的了,我提醒一下,字符修饰符才是最恶心的,因为你甚至不知道当前字体是否支持字符修饰符,它到底会渲染到另一个字符上去还是渲染成豆腐块。
    blueset
        21
    blueset  
       2019-12-27 18:17:17 +08:00
    ljust 或者 format spec mini-lang 应该都不错。

    顺便,图片确实是 403 了。

    fuchunliu
        22
    fuchunliu  
       2019-12-27 18:22:09 +08:00 via Android
    数字宽度格式化一下?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3001 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 14:43 · PVG 22:43 · LAX 07:43 · JFK 10:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.