Datei fortlaufend nummerieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
maria_dolores
User
Beiträge: 39
Registriert: Dienstag 10. August 2010, 12:38

Hallo zusammen,

ich habe hier eine Methode, die einen Bar-Plot erzeugt. Wenn ich diese Methode mehrfach aufrufen möchte, soll sie jeweils eine Datei des Plots speichern, aber jedes Mal unter einem 'anderem' Namen.

Ich hoffe, ihr wisst was ich meine.

Hier meine Methode:

Code: Alles auswählen

def build_the_figure(self, x_axis_content, y_axis_content, number_of_extra_bars, extra_bar_content, extra_bar_legend, x_label, y_label, extra_y_label):
     fig = plt.figure()
        ax1 = fig.add_subplot(111)
        N = len(x_axis_content)
        ind = np.arange(N)
        width = 0.15
        rects = ax1.bar(ind + width, y_axis_content, width, color = 'k' )
        if number_of_extra_bars != None:
            length = number_of_extra_bars + 1
            for i in range(1, length):
                for rect in rects:
                    ax2 = ax1.twinx()
                    rect = ax2.bar(ind + (i+1)*width, extra_bar_content, width, color = 'r')
                    ax1.set_xlabel(str(x_label))
                    ax1.set_ylabel(str(y_label))
                    ax2.grid(color = 'grey', linestyle='-', linewidth = 0.09)
                    ax2.set_ylabel(str(extra_y_label))
                    plt.xticks(ind + width, x_axis_content)
                    leg = plt.legend((rects[0], rect[0]), (str(y_label), str(extra_bar_legend)))
                    for t in leg.get_texts():
                        t.set_fontsize('small')
        else:
            rects = ax1.bar(ind + width, y_axis_content, width, color = 'r')
            ax1.set_xlabel(str(x_label))
            ax1.set_ylabel(str(y_label))
            ax1.grid(color = 'grey', linestyle='-', linewidth = 0.09)
            plt.xticks(ind + width, x_axis_content)
        fig.savefig(sys.path[0])
        return rects
Habt ihr eine Idee, wie man das machen könnte?

Grüßle
Isa
BlackJack

@maria_dolores: Warum ist das eine "Methode"? Das Objekt wird überhaupt nicht verwendet, also warum steckt diese Funktion in einer Klasse?

Und ``sys.path[0]`` zum Speichern!? Ernsthaft!?

Zum eigentlichen Problem: Dateinamen als Argument übergeben lassen und beim Aufrufer halt entsprechend nummerierte Dateinamen erzeugen lassen. `xrange()`, `enumerate()`, oder `itertools.count()` könnten dazu hilfreich sein.
maria_dolores
User
Beiträge: 39
Registriert: Dienstag 10. August 2010, 12:38

@BlackJack: Die Methode steckt in einer Klasse, weil das nicht die einzige Methode ist. Das hat schon seinen Sinn.

Das sys.path[0] hab ich nur erst mal hingeschrieben, weil es später in den gleichen Ordner gespeichert werden soll, in der aucn mein Code ist.

Ich wusste nur nicht, wie ich das Ganze fortlaufend hinbekommen.

Ich habe es jetzt so gemacht:

Code: Alles auswählen

fig.savefig(sys.path[0]+ 'Bild'+str(itertools.count(1))+'.png')
Geht das an sich so oder ganz falsch?

Grüßle
Isa
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Ich würde einfach mit 0 beginnen. Auflisten des Verzeichnisses,

Code: Alles auswählen

os.listdir()
und dann hinaufzählen (bis zum ersten

Code: Alles auswählen

not os.path.exists(datei+currentdirr)
), dann diesen Namen zum speichern verwenden.
maria_dolores
User
Beiträge: 39
Registriert: Dienstag 10. August 2010, 12:38

@Francesco: Ich habe es jetzt so versucht.. weiss aber nicht, ob es so geht:

Code: Alles auswählen

fig.savefig(str(itertools.count(not os.path.exists('Bild'+os.listdir())))+'.png')
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Vielleicht so in der Art:

zu Beginn:

mybasepath = <irgendwas>, zb "~/.figure"

Code: Alles auswählen

import os
if not os.path.exists(mybasepath):
    os.mkdir(mybasepath)
file_nr_index = 0 #begin after the last file
while os.path.exists(os.path.join(mybasepath, "Bild%04d.png" % file_nr_index):
    file_nr_index += 1
dann:

Code: Alles auswählen

newfilename = os.path.join(mybasepath, "Bild%04d.png" % file_nr_index)
fig.savefig(newfilename)
file_nr_index += 1
BlackJack

@maria_dolores: Was ist denn der Sinn der "Methode"? Es ist ja keine. Vom Sinn her.

Du solltest weniger "programming by accident" betreiben und mehr über die Sachen nachdenken, die Du versuchst. Zum Beispiel hat es sehr wenig Sinn die vorgeschlagenen Sachen einfach irgendwie in einer Zeile zu kombinieren und zu fragen ob das so funktioniert. *Das* könntest Du auch ganz schnell und einfach selber herausfinden, in dem Du es einfach ausführst.
maria_dolores
User
Beiträge: 39
Registriert: Dienstag 10. August 2010, 12:38

@BlackJack: Also ich möchte mich eigentlich nicht für meine Art rechtfertigen müssen.

Meine Methode ist eben eine Methode. Warum das so ist oder ob Du das gerade nachvollziehen kannst, hat ja nichts mit meiner Überlegung oder der Frage zu tun. Es ging ja nicht um die Methode selbst, sondern nur um die Nummerierung.


@Francesco: Ich habe es probiert und es funktioniert jetzt super. Dankeschön
BlackJack

@maria_dolores: Deine Methode ist eben keine Methode. Nur formal, aber nicht vom Inhalt her.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

maria_dolores hat geschrieben: @Francesco: Ich habe es probiert und es funktioniert jetzt super. Dankeschön
Bitte. Es ist oft auch ganz gut (also wenn man beginnt), sich einfach einmal das Python tutorial durchzuarbeiten (auch wenn man Python später nicht mehr so oft einsetzt). Das hat man an zwei Abenden durch. Kommt drauf an wie genau mans nimmt... Oder einfach weiß, wie man am besten in google nach codelösungen sucht. ;)
Antworten