web-dev-qa-db-ja.com

Python

Pythonでは、次のようなコードでテキストファイルに書き込みます。

f.write(filename + type + size + modified)

そしてもちろん、出力は本当に醜く見えます:

C:/Config/ControlSet/__db.006  file          56 KB   2012-Apr-30 10:00:46.467 AM
C:/Config/ControlSet dir       68881 KB   2012-Apr-30 10:00:46.396 AM 
C:/Config/DataStore.avlocate file           0 KB   2012-Apr-30 09:57:42.440 AM 
C:/Config/DataStoreLocate.bak file           0 KB   2012-Apr-30 09:57:42.470 AM 
C:/Config/DeviceConnections/devconn.bak file          41 KB   2012-Apr-30 10:39:50.181 AM   
C:/Config/DeviceConnections/devconn.cfg file          41 KB   2012-May-29 10:12:45.288 AM

しかし、私はエントリを次のように揃えたいと思います:

C:/Config/ControlSet/__db.006                                            file          56 KB   2012-Apr-30 10:00:46.467 AM
C:/Config/ControlSet                                                      dir       68881 KB   2012-Apr-30 10:00:46.396 AM 
C:/Config/DataStore.avlocate                                             file           0 KB   2012-Apr-30 09:57:42.440 AM 
C:/Config/DataStoreLocate.bak                                            file           0 KB   2012-Apr-30 09:57:42.470 AM 
C:/Config/DeviceConnections/devconn.bak                                  file          41 KB   2012-Apr-30 10:39:50.181 AM   
C:/Config/DeviceConnections/devconn.cfg                                  file          41 KB   2012-May-29 10:12:45.288 AM

私の問題は この質問 に似ていますが、ファイル名が事前にどれだけ長くなるかはわかりません。私はこれにどのように取り組むべきですか?

9

すべてのファイル名のリストを最初に取得できる場合は、次のようにすることができます。

max_width = max(len(filename) for filename in filenames)
for filename in filenames:
    f.write(filename.ljust(max_width+1)+..whatever else..)

最初にすべてのファイル名のリストを取得できない場合、すべてが整列することを確認する方法はありません。名前が本当に長いファイルを後で取得するかどうかを知る方法がないためです。

ただし、このようなケースでは、通常、N列で一般に十分であると想定しています。

f.write('%-40s %6s %10s %2s\n' % (filename, type, size, modified))
26
Edward Loper

あなたが探しているのは str.ljust() メソッドと多分 str.rjust() だと思います。

ドキュメントに記載されているように、元の文字列は長すぎる場合に返されるため、データを切り捨てることはありませんが、本当に完全なフォーマットを取得するには、事前に最長の長さを見つける必要があります。完全である必要がない限り、値にはかなり大きな数を使用することをお勧めします。

何かのようなもの...

f.write(
    "{0} {1} {2} {3}".format(
        filename.ljust(max_filename),
        type.rjust(max_type),
        size.rjust(max_size),
        modified.rjust(max_modified)
        )
    )

トリックを行います。

12
mayhewr