Вопрос по python, text, file – Написание красиво отформатированного текста на Python

7

В 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

Моя проблема похожа наэтот вопрос кроме того, что я не знаю, как долго имена файлов будут заранее. Как мне подойти к этому?

Ваш Ответ

2   ответа
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)
        )
    )

сделал бы трюк.

24

Если вы можете сначала получить список всех имен файлов, то вы можете сделать что-то вроде:

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))

Похожие вопросы