18

我有一个包含用户登录数据的纯文本文件:

dtrapani  HCPD-EPD-3687  Mon  05/13/2013    9:47:01.72
dlibby  HCPD-COS-4611  Mon  05/13/2013    9:49:34.55
lmurdoch  HCPD-SDDEB-3736  Mon  05/13/2013    9:50:38.48
lpatrick  HCPD-WIN7-015  Mon  05/13/2013    9:57:44.57
mlay  HCPD-WAR-3744  Mon  05/13/2013  10:00:07.94
eyoung  HCPD-NLCC-0645  Mon  05/13/2013  10:03:01.83

我正在尝试在左右对齐的列中打印数据:

dtrapani  HCPD-EPD-3687    Mon  05/13/2013    9:47:01.72
dlibby    HCPD-COS-4611    Mon  05/13/2013    9:49:34.55
lmurdoch  HCPD-SDDEB-3736  Mon  05/13/2013    9:50:38.48
lpatrick  HCPD-WIN7-015    Mon  05/13/2013    9:57:44.57
mlay      HCPD-WAR-3744    Mon  05/13/2013   10:00:07.94
eyoung    HCPD-NLCC-0645   Mon  05/13/2013   10:03:01.83

我怎样才能做到这一点?

这是我到目前为止的代码:

with open(r'C:\path\to\logons.txt', 'r') as f:
    for line in f:
        data = line.strip()
        print(data)
4

4 回答 4

18

我会使用这个新的(er)打印格式化程序(假设你的字段是一致的)。print/format 语句非常易于使用,可以在此处找到。由于您的数据可以被视为一个列表,因此您可以进行一次格式化调用并提供正确的格式化程序数据,您将获得输出。这比 ljust 或 rjust 具有更细粒度的控制,但缺点是您需要知道传入的数据是一致的。

with open(r'C:\path\to\logons.txt', 'r') as f:
    for line in f:
        data = line.split()    # Splits on whitespace
        print '{0[0]:<15}{0[1]:<15}{0[2]:<5}{0[3]:<15}{0[4]:>15}'.format(data)
于 2013-05-28T17:21:34.497 回答
6

str.ljust(width, [fillchar=" "])http://docs.python.org/2/library/stdtypes.html#str.ljust)似乎是你所追求的。打印到最大长度时左对齐每个字段+一点点。

对于与您的示例匹配的最后一个字段,您需要使用 rjust 来右对齐它。

于 2013-05-28T16:21:21.567 回答
0
#!/usr/bin/env python
import sys
inputfile = '''dtrapani HCPD-EPD-3687 Mon 05/13/2013 9:47:01.72
dlibby HCPD-COS-4611 Mon 05/13/2013 9:49:34.55
lmurdoch HCPD-SDDEB-3736 Mon 05/13/2013 9:50:38.48
lpatrick HCPD-WIN7-015 Mon 05/13/2013 9:57:44.57
mlay HCPD-WAR-3744 Mon 05/13/2013 10:00:07.94
eyoung HCPD-NLCC-0645 Mon 05/13/2013 10:03:01.83'''.split('\n')
output = sys.stdout
lengths = [10,17,5,14,0]
for line in inputfile:
    line = line.split()
    for field, fieldlength in zip(line,lengths):
        output.write(field.ljust(fieldlength))
    output.write('\n')
于 2013-05-28T17:14:32.393 回答
0

从 Python 3.6+ 开始

使用现代f-string语法:

with open(r'logons.txt', 'r') as f:
    for line in f:
        s = line.split()
        print(f'{s[0]:<10}{s[1]:<17}{s[2]:<5}{s[3]:<12}{s[4]:>12}')
        #     ^       ^^^       ^^^       ^^       ^^^       ^^^
        # f-string  left-10   left-17   left-5   left-12   right-12

输出:

dtrapani  HCPD-EPD-3687    Mon  05/13/2013    9:47:01.72
dlibby    HCPD-COS-4611    Mon  05/13/2013    9:49:34.55
lmurdoch  HCPD-SDDEB-3736  Mon  05/13/2013    9:50:38.48
lpatrick  HCPD-WIN7-015    Mon  05/13/2013    9:57:44.57
mlay      HCPD-WAR-3744    Mon  05/13/2013   10:00:07.94
eyoung    HCPD-NLCC-0645   Mon  05/13/2013   10:03:01.83
于 2021-12-05T23:10:33.527 回答