2012-05-30 22 views
6

W Pythonie Piszę do pliku tekstowego z kodem jak:Pisanie ładnie sformatowany tekst w Pythonie

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

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

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ę aby wyrównać wpisy więc wygląda to 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 this question wyjątkiem nie wiem jak długo nazwy plików będą wcześniejsze. Jak mam się do tego podejść?

Odpowiedz

19

Jeśli można uzyskać listę wszystkich nazw, a dopiero potem można 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żna uzyskać listę wszystkich nazw pierwsze, to nie ma mowy, aby upewnić się, że wszystko się ułoży, ponieważ nie ma sposobu, aby dowiedzieć się, czy później dostaniesz plik, którego nazwa jest naprawdę długa.

W przypadku takim jak ten, choć ja zazwyczaj po prostu założyć, że N kolumnach jest zazwyczaj wystarczająca, dla pewnego n, w którym to przypadku można po prostu zrobić coś takiego:

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

Myślę, że to, czego szukasz, to metoda str.ljust(), a może także str.rjust().

Jak mówi się w dokumentach, oryginalny ciąg jest zwracany, jeśli jest zbyt długi, więc nigdy nie usuniesz żadnych danych, ale musisz znaleźć najdłuższe długości z wyprzedzeniem, aby uzyskać naprawdę doskonałe formatowanie . Sugerowałbym użycie dość dużej liczby dla wartości, chyba że musi być idealny.

Coś ...

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

by rade.

Powiązane problemy