Pytanie w sprawie python, text, file – Pisanie ładnie sformatowanego tekstu w Pythonie

7

W Pythonie piszę do pliku tekstowego z kodem takim jak:

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

I oczywiście wyjście wygląda naprawdę brzydko:

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

Ale chcę wyrównać wpisy, aby wyglądały tak:

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

Mój problem jest podobny do tegoto pytanie poza tym, że nie wiem, jak długo nazwy plików będą wcześniej. Jak mam się do tego zbliżyć?

Twoja odpowiedź

2   odpowiedź
12

str.ljust () metoda i możestr.rjust () zbyt.

Jak napisano w dokumentach, oryginalny łańcuch jest zwracany, jeśli jest za długi, więc nigdy nie obcinasz żadnych danych, ale musisz znaleźć najdłuższe długości z wyprzedzeniem, aby uzyskać naprawdę idealne formatowanie. Sugerowałbym po prostu użycie rozsądnie dużej liczby dla wartości, chyba że musi być idealna.

Coś jak...

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

załatwi sprawę.

24

możesz zrobić coś takiego:

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

Jeśli nie możesz najpierw uzyskać listy wszystkich nazw plików, to nie ma sposobu, aby upewnić się, że wszystko będzie wyrównane, ponieważ nie ma możliwości sprawdzenia, czy później zdobędziesz plik, którego nazwa jest naprawdę długa.

W takim przypadku zazwyczaj zakładam jednak, że na ogół N kolumn jest wystarczająca, dla niektórych N, w takim przypadku możesz po prostu zrobić coś takiego:

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

Powiązane pytania