Pycharm 中制表符输出无法对齐,这个怎么解决啊? - V2EX
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 7344 次点击
    这是一个创建于 2186 天前的主题,其中的信息可能已经有所发展或是发生改变。
    直接上代码吧:
    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 的锅

    无论什么语言写对齐都要算字符宽度然后填充空格
    中文字符宽度还要麻烦一点
    labubu
        17
    labubu  
       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     Solana     2227 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 16:06 PVG 00:06 LAX 08:06 JFK 11:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86