【问题标题】:Python - print table-like data cleanly [duplicate]Python - 干净地打印类似表格的数据[重复]
【发布时间】:2016-11-08 21:40:07
【问题描述】:

我的输出看起来像这样

AB%CD3_SW3Z_1000 uvsec_czrkup_rmplr SeightRveZargrp def_move 35.8% 28.0% 16.2% 120 0.0010
MN%P03_AT%W00_500 uvsec_czrkup_rmplr SeightRveZargrp def_move 28.8% 24.7% 23.4% 94 0.1000
KE_A03_UVA%Q00_100 uvsec_czrkup_rmplr SeightRveZargrp def_move 27.2% 11.8% 3.5% 398 0.010

最干净、最优雅的格式化方式是什么

AB%CD3_SW3Z_1000   uvsec_czrkup_rmplr SeightRveZargrp def_move 35.8% 28.0% 16.2% 120 0.0010
MN%P03_AT%W00_500  uvsec_czrkup_rmplr SeightRveZargrp def_move 28.8% 24.7% 23.4% 94 0.1000
KE_A03_UVA%Q00_100 uvsec_czrkup_rmplr SeightRveZargrp def_move 27.2% 11.8% 3.5% 398 0.010

当然,我问的是一般情况,假设每行具有相同数量的标记。我希望列左对齐。

【问题讨论】:

  • 问题是,它是一个数据框。当我打印它时,它会像那样乱七八糟。

标签: python string-formatting pretty-print


【解决方案1】:

我过去曾将PrettyTables用于此类应用程序和此功能:

def format_df(df):    
    table = PrettyTable([''] + list(df.columns))
    for row in df.itertuples():
        table.add_row(row)
    return str(table)

使用您的输入的完整示例如下所示:

import pandas as pd
from prettytable import PrettyTable

def format_df(df):    
    table = PrettyTable([''] + list(df.columns))
    for row in df.itertuples():
        table.add_row(row)
    return str(table)

df = pd.read_clipboard(header=None)   # No header provided on example input
print(format_df(df))

这会生成以下输出。标头命名不佳,因为您的示例数据中没有提供标头:

+---+--------------------+--------------------+-----------------+----------+-------+-------+-------+-----+-------+
|   |         0          |         1          |        2        |    3     |   4   |   5   |   6   |  7  |   8   |
+---+--------------------+--------------------+-----------------+----------+-------+-------+-------+-----+-------+
| 0 |  AB%CD3_SW3Z_1000  | uvsec_czrkup_rmplr | SeightRveZargrp | def_move | 35.8% | 28.0% | 16.2% | 120 | 0.001 |
| 1 | MN%P03_AT%W00_500  | uvsec_czrkup_rmplr | SeightRveZargrp | def_move | 28.8% | 24.7% | 23.4% |  94 |  0.1  |
| 2 | KE_A03_UVA%Q00_100 | uvsec_czrkup_rmplr | SeightRveZargrp | def_move | 27.2% | 11.8% |  3.5% | 398 |  0.01 |
+---+--------------------+--------------------+-----------------+----------+-------+-------+-------+-----+-------+

【讨论】:

    【解决方案2】:

    您可以这样做的一种方法是使用str.ljust(width)(假设您已将所有内容转换为字符串)填充每行中的每个标记,以使列中的每个标记具有相同的宽度。要确定要使用的宽度,请设置固定宽度(如果您知道令牌的最大可能长度),或者通过获取每列中的最大条目来为每列设置固定宽度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2012-06-01
      相关资源
      最近更新 更多