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 回答