2016-04-10 11 views
1

特定の列を揃えるためにprint文を書式化しようとしています。Python - 特定の列を揃えるために印刷をフォーマットする

現在、私の出力は次のとおりです。

0 - Rusty Bucket (40L bucket - quite rusty) = $0.00 
1 - Golf Cart (Tesla powered 250 turbo) = $195.00* 
2 - Thermomix (TM-31) = $25.50* 
3 - AeroPress (Great coffee maker) = $5.00 
4 - Guitar (JTV-59) = $12.95 

私が探しています出力は次のとおりです。ここで

0 - Rusty Bucket (40L bucket - quite rusty) = $0.00 
1 - Golf Cart (Tesla powered 250 turbo)  = $195.00* 
2 - Thermomix (TM-31)       = $25.50* 
3 - AeroPress (Great coffee maker)    = $5.00 
4 - Guitar (JTV-59)       = $12.95 

は、私は現在、印刷のために使用していますコードです:

def list_items(): 
    count = 0 
    print("All items on file (* indicates item is currently out):") 
    for splitline in all_lines: 
     in_out = splitline[3] 
     dollar_sign = "= $" 
     daily_price = "{0:.2f}".format(float(splitline[2])) 
     if in_out == "out": 
      in_out = str("*") 
     else: 
      in_out = str("") 
     print(count, "- {} ({}) {}{}{}".format(splitline[0], splitline[1], dollar_sign, daily_price, in_out)) 
     count += 1 

私は次のような書式を使ってみました:

print(count, "- {:>5} ({:>5}) {:>5}{}{}".format(splitline[0], splitline[1], dollar_sign, daily_price, in_out)) 

ただし、整列する1つの列だけを取得することはできませんでした。どんな助けや提案も大歓迎です!私もpython 3.xを使用しています

私はすべての情報を含めるためにタプルを使用しています。all_linesはそのままです。情報は元々csvから読み込まれています。恐ろしい命名規則に謝罪し、機能性を最初に働かそうとしています。

申し訳ありませんが、これは他の場所で回答されています。私は探してみました。

編集:ここに私のall_linesため

import csv 
open_file = open('items.csv', 'r+') 
all_lines = [] 
for line in open_file: 
    splitline = line.strip().split(',') 
    all_lines.append((splitline[0], splitline[1], splitline[2], splitline[3])) 

を使用してコードイムであり、ここでcsvファイルの情報は次のとおりです。

Rusty Bucket,40L bucket - quite rusty,0.0,in 
Golf Cart,Tesla powered 250 turbo,195.0,out 
Thermomix,TM-31,25.5,out 
AeroPress,Great coffee maker,5.0,in 
Guitar,JTV-59,12.95,in 

答えて

0

:あなたはこれで柔軟性を得てもよいので、[EDIT]私は今もTABULATEのバージョンが含まれている

import csv 
from tabulate import tabulate 
open_file = open('items.csv', 'r+') 
all_lines = [] 
for line in open_file: 
    splitline = line.strip().split(',') 
    all_lines.append((splitline[0], splitline[1], splitline[2], splitline[3])) 

#print all_lines 
count = 0 
new_lines=[] 
for splitline in all_lines: 
    in_out = splitline[3] 
    dollar_sign = "= $" 
    daily_price = "{0:.2f}".format(float(splitline[2])) 
    if in_out == "out": 
     in_out = str("*") 
    else: 
     in_out = str("") 
    str2='('+splitline[1]+')'  
    print count, "- {:<30} {:<30} {}{:<30} {:<10}".format(splitline[0], str2, dollar_sign, daily_price, in_out) 
    new_lines.append([splitline[0], str2, dollar_sign, daily_price, in_out]) 
    count += 1 

print tabulate(new_lines, tablefmt="plain") 
print 
print tabulate(new_lines, tablefmt="plain", numalign="left") 
+0

これは、私が各all_lines.append()を指定せずにこれを行う方法があるかどうか疑問に思っている唯一のものです。余分な行を追加するプログラムで作業しているので、追加のコンテンツを表示できるようにする必要があります。迅速な返信のための乾杯! –

+0

私はあなたのデータがどこから来ているかわからないので、そのall_lineステートメントだけを使用しました。そのように見えるので、添付してall_linesを作成しました。私は、あなたのall_lineがすでに最初の3行で生成しているフォーマットを持っていると仮定しました。 all_linesをより詳細に指定できますか?最初の3行をスキップしてall_linesを使用しようとしましたか? – tfv

+0

確かに、私のall_linesは現在、次のようになります。 open_file =オープン( 'items.csv'、 'R +') all_lines = [] ラインのopen_fileで:。 分割線= line.strip()スプリット( '' ) all_lines.append((splitline [0]、splitline [1]、splitline [2]、splitline [3])) 私はcsvファイルから情報を引き出しています。 –

0

あなたはstr.ljust(width[, fillchar])をご覧ください:

> '(TM-31)'.ljust(15) 
'(TM-31)  ' # pad to width 

その後、可変長の{} ({})部分を抽出し、必要な幅にパディングします。あなたがかもしれ探しているものを

0

私は自分自身で印刷形式を制御する考えが嫌いです。

この場合、私は、Tabulateのような表ライブラリを活用します。

二つの重要な点は次のとおり

  1. tablefmt PARAMとの適切な印刷フォーマットを選択
  2. (リスト内の例えばリスト)テーブル内のデータを保持します。
関連する問題