Frage an file, python, text – Schön formatierten Text in Python schreiben

7

In Python schreibe ich in eine Textdatei mit folgendem Code:

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

Und natürlich sieht die Ausgabe wirklich hässlich aus:

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

Aber ich möchte die Einträge so ausrichten, dass sie so aussehen:

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

Mein Problem ist ähnlich wiediese Frage außer ich weiß nicht, wie lange die Dateinamen vorher sein werden. Wie soll ich das angehen?

Deine Antwort

2   die antwort
12

Ich denke, was Sie suchen, ist dasstr.ljust () Methode und vielleichtstr.rjust () auch.

Wie in den Dokumenten angegeben, wird die ursprüngliche Zeichenfolge zurückgegeben, wenn sie zu lang ist. Sie werden also niemals Daten abschneiden, müssen jedoch die längsten Längen im Voraus ermitteln, um eine wirklich perfekte Formatierung zu erzielen. Ich würde vorschlagen, nur eine relativ große Zahl für die Werte zu verwenden, es sei denn, es muss perfekt sein.

So etwas wie...

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

würde den Trick machen.

24

Wenn Sie zuerst eine Liste aller Dateinamen erhalten, können Sie Folgendes tun:

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

Wenn Sie nicht zuerst eine Liste aller Dateinamen abrufen können, können Sie nicht sicherstellen, dass alle Dateinamen in einer Linie liegen, da Sie später nicht wissen können, ob Sie eine Datei mit einem wirklich langen Namen erhalten.

In einem solchen Fall würde ich jedoch normalerweise einfach davon ausgehen, dass N Spalten im Allgemeinen für einige N ausreichen. In diesem Fall können Sie einfach Folgendes tun:

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

Verwandte Fragen