11

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

私の問題はこの質問に似ていますが、ファイル名が事前にどれくらいの長さになるかわかりません。これにどのようにアプローチすればよいですか?

4

2 に答える 2

28

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

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

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

ただし、このような場合、通常は N 列で十分であると想定します。N の場合、次のようにすることができます。

f.write('%-40s %6s %10s %2s\n' % (filename, type, size, modified))
于 2012-05-30T17:28:56.487 に答える
12

あなたが探しているのは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)
        )
    )

トリックを行うでしょう。

于 2012-05-30T17:21:56.397 に答える