1

非常に基本的なレベルでレプリケートし、すべての株価とその所有額を列を同じ行に保持してきれいに表示するプログラムを作成して、見栄えを良くしたいと考えています。私はこのコードをやってみました:

print '{:1s} {:1s} {:1s} {:4.2f} {:1s} {:10d} {:1s}'.format('|','NAME','|',53.63,'|', 10000000, '|')
print '{:1s} {:1s} {:1s} {:4.2f} {:1s} {:10d} {:1s}'.format('|','NAME','|',4837.34,'|', 1000000000, '|')

しかし、それは次のように表示されます:

| NAME | 53.63 |   10000000 |
| NAME | 4837.34 | 1000000000 |

そして、私はそれをこのように表示したい

| NAME |  53.63  | 10000000   |
| NAME | 4837.34 | 1000000000 |

または同様の方法で。左右のラインを揃えてすっきり見えるようにしたい

これを達成できる方法はありますか?

前もって感謝します

4

3 に答える 3

2

このようなもの:

print '| {:^4} | {:^7.2f} | {:<10} |'.format('NAME', 53.63, 10000000)
print '| {:^4} | {:^7.2f} | {:<10} |'.format('NAME',4837.34,1000000000)

出力:

| NAME |  53.63  | 10000000   |
| NAME | 4837.34 | 1000000000 |

からフィールド幅を渡すこともできますformat:

print '| {:^{}} | {:^{}.2f} | {:<{}} |'.format('NAME', 4, 53.63, 7, 10000000, 10)
print '| {:^{}} | {:^{}.2f} | {:<{}} |'.format('NAME', 4, 4837.34, 7, 1000000000, 10)

出力:

| NAME |  53.63  | 10000000   |
| NAME | 4837.34 | 1000000000 |
于 2013-11-05T07:31:03.053 に答える
1

ドキュメントで説明されているFormat Specification Mini-Languageを使用すると、各フィールドでオプションの幅指定子を使用できます (数値の位置合わせと精度を制御するその他の指定子と共に)。

fmt = '| {:^8s} | {:>10,.2f} | {:>14,d} |'
print fmt.format('NAME', 53.63, 10000000)
print fmt.format('NAME', 4837.34, 1000000000)

幅の値は、フィールド データと混合することもできます。

fmt = '| {:^{}s} | {:>{},.2f} | {:>{},d} |'
print fmt.format('NAME', 8, 53.63, 10, 10000000, 14)
print fmt.format('NAME', 8, 4837.34, 10, 1000000000, 14)

または、それぞれを別のステップで指定して、2 つのタイプの値を区別することもできます。

fmt = '| {{:^{}s}} | {{:>{},.2f}} | {{:>{},d}} |'.format(8, 10, 14) # widths only
print fmt.format('NAME', 53.63, 10000000) # data only
print fmt.format('NAME', 4837.34, 1000000000)

何でも、これは出力になります:

|   NAME   |      53.63 |     10,000,000 |
|   NAME   |   4,837.34 |  1,000,000,000 |

明らかに、データの各列の最大幅を事前に知る必要があります。それがわからない場合は、使用する適切なフィールド幅指定子の値を決定するために、各列のすべての値を調べて最大のものを見つける必要がある場合があります-すべてのデータが出力される前に利用可能であると仮定します。

于 2013-11-05T08:26:06.150 に答える
0

タブ区切りのファイルにデータがあると仮定すると、まず、これでうまくいくはずです。

def tabularize(infilepath, outfilepath, delim='\t', largeFile=False):
    """ Return nothing
        Write into the file in outfilepath, the contents of infilepath, expressed in tabular form.
        The tabular form is similar to the way in which SQL tables are displayed.
        If largeFile is set to True, then no caching of lines occurs. However, two passes of the infile are required"""

    if largeFile:
        widths = getWidths(infilepath, delim)
    else:
        with open(infilepath) as infile:
            lines = [line.strip().split(delim) for line in infile.readlines() if line.strip()]
        widths = [max([len(row) for row in rows])+2 for rows in izip_longest(*lines, fillvalue="")]

        with open(outfilepath, 'w') as outfile:
            outfile.write("+")
            for width in widths:
                outfile.write('-'*width + "+")
            outfile.write('\n')
            for line in lines:
                outfile.write("|")
                for col,width in izip_longest(line,widths, fillvalue=""):
                    outfile.write("%s%s%s|" %(' '*((width-len(col))/2), col, ' '*((width+1-len(col))/2)))
                outfile.write('\n+')
                for width in widths:
                    outfile.write('-'*width + "+")
                outfile.write('\n')

def getWidths(infilepath, delim):
    answer = defaultdict(int)
    with open(infilepath) as infile:
        for line in infile:
            cols = line.strip().split(delim)
            lens = map(len, cols)
            for i,l in enumerate(lens):
                if answer[i] < l:
                    answer[i] = l

    return [answer[k] for k in sorted(answer)]

if __name__ == "__main__":
    print 'starting'

    infilepath = 'testin'
    outfilepath = 'testout'
    tabularize(infilepath, outfilepath, '...', False)

    print 'done'
于 2013-11-05T07:26:50.413 に答える