2013-06-28 18 views
8

Python 2.7では、文字列形式のテンプレートを使用してdatetimeオブジェクトを出力したいと考えています。なんらかの理由で、左揃えと右揃えを使用しても文字列が正しく表示されません。日時文字列形式の整列

import datetime 
dt = datetime.datetime(2013, 6, 26, 9, 0) 
l = [dt, dt] 
template = "{0:>25} {1:>25}" # right justify 
print template.format(*l) #print items in the list using template 

これが発生します。その代わり

2013-06-26 09:00:00  2013-06-26 09:00:00 

>25 >25 

は、文字列形式のテンプレートを使用してDateTimeオブジェクトの印刷を行うにはいくつかのトリックはありますか?

私がSTR()にdatetimeオブジェクトを強制するときに動作するようです

print template.format(str(l[0]), str(l[1])) 

私はむしろ、私は、そのうちのいくつかを値のリストを印刷しようとしているので、それを行う必要はありませんと思います文字列ではありません。文字列テンプレートを作成する全体のポイントは、リスト内の項目を印刷することです。

私は文字列の書式について何か不足していますか、これは誰にもPythonバグのようですか?


SOLUTION

@mgilsonは、私はドキュメントで逃したソリューションを指摘しました。値に )さん!」STRを呼び出す(、および()はreprを呼び出しては 'r!':link

2つの変換フラグが現在サポートされています。

いくつかの例:

"Harold's a clever {0!s}"  # Calls str() on the argument first 
"Bring out the holy {name!r}" # Calls repr() on the argument first 

答えて

4

ここでの問題は、datetimeオブジェクトは基本的にdatetime.strftimeのためだけの別名である__format__方法を持っているということです。書式設定を実行すると、書式機能に文字列'>25'が渡されます。これまでのように、dt.strftime('>25')'>25'を返します。

ここでこの問題を回避するには、フィールドが明示的に!sを使用して文字列としてフォーマットする必要があることを指定します(両方のpython2.6および2.7でテスト)

import datetime 
dt = datetime.datetime(2013, 6, 26, 9, 0) 
l = [dt, dt] 
template = "{0!s:>25} {1!s:>25} " 
out = template.format(*l) 
print out 

+0

私はおとなしいでしょう。それがまさに私が必要としていたものです。 これについてはドキュメントの1行が見つかりませんでした。 [link](http://docs.python.org/2/library/string.html#format-string-syntax) 現在、2つの変換フラグがサポートされています: '!s'は値に対してstr()を呼び出します。 、およびrepr()を呼び出す '!r'。_ –

+0

@MarcelWilson - 私はそれを探しに行くまで、これについては知らなかった。 – mgilson

2

datetime.datetimeformat methodを持っています。それをstrに変換する必要があります。

>>> '{:%Y/%m/%d}'.format(dt) 
'2013/06/26' 
>>> '{:>20}'.format(dt) 
'>20' 
>>> '{:>20}'.format(str(dt)) 
' 2013-06-26 09:00:00' 

>>> import datetime 
>>> dt = datetime.datetime(2013, 6, 26, 9, 0) 
>>> l = [dt, dt] 
>>> template = "{0:>25} {1:>25}" 
>>> print template.format(*l) 
>25 >25 
>>> print template.format(*map(str, l)) 
     2013-06-26 09:00:00  2013-06-26 09:00:00 
+0

これは、私が@ mgilsonの解決策を読むまで回避策として行ったことです。文字列形式のテンプレートがしなければならなかったのは、それが(afaik)のときにstr()を呼び出すのは厄介でした。 –

1

は、これを試してください

print template.format(*map(str, l)) 
=>  2013-06-26 09:00:00  2013-06-26 09:00:00 

それはまず問題なくformat方法でフォーマットすることができる文字列にdatetimeオブジェクトを変換することによって動作します。