Funktion um mehrere Ordner nacheinander zu öffnen

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
BatsillasD
User
Beiträge: 30
Registriert: Mittwoch 6. November 2019, 13:42

Hallo,

ich bin ein ziemlicher Neuling und suche eine Möglichkeit um mehrere Anordner nacheinander zu öffnen und in jedem geöffneten ordner aus jeweils der gleichen zeile einer Datei werte einzulesen. Die Ordner sind dabei jeweils mit "Ordner_n" n=1,2,3,....9 gekennzeichnet.

Habt ihr dazu eine Lösung? Würde mich sehr über Hilfe freuen.

Liebe Grüße
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@BatsillasD: was hast Du schon versucht?
Willst du die Ordner suchen, oder nur nach dem fixen Schema die Ordner für verschiedene `n ` durchgehen?
BatsillasD
User
Beiträge: 30
Registriert: Mittwoch 6. November 2019, 13:42

Hallo, unten ist mein Versuch. Zur Erklärung die Variable ordner beinhaltet den Pfad zu der jeweiligen Datei. Der Ordnername ändert sich jeweils nur an der Stelle i, eben beispielsweise Ordner_1, Ordner_2 usw.
Nach meinem Verständnis müssten alle Dateien eingelesen und in der shell geprintet werden.

Code: Alles auswählen


ordner = "Eingabe/Ordner_i/Text.dat"   
if __name__ == "__main__":
     
    counter = 0
    for i in xrange(1,9):
    
    f = open('ordner','r')  
    print(f.read())  
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@BatsillasD: bei Dir fehlen noch die Grundlagen, was literale Strings sind und was Variablen. In Strings werden nicht auf magische Weise Teile, die wie Variablennamen aussehen, durch den Wert dieser Variablen ersetzt. Das muß man explizit durch Stringformatierung machen.

`counter` wird nirgends benutzt und Dateien die man öffnet, sollte man auch wieder schließen, am besten mit Hilfe des with-Statements. Bei Text-Dateien immer explizit ein Encoding angeben. Die Einrückungen stimmen noch nicht.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mich irritiert noch das xrange. Das sieht schwer nach Python 2 aus und als Anfänger auf Python 2 zu setzen, dessen Support zum 01.01.2020 ausläuft, ist eine ziemlich schlechte Idee.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Beispiel der Stringformatierung:

Code: Alles auswählen

for n in range(1,9):
    print(f"Eingabe/Ordner_{n}/Text.dat")

Ausgabe:

Eingabe/Ordner_1/Text.dat
Eingabe/Ordner_2/Text.dat
Eingabe/Ordner_3/Text.dat
Eingabe/Ordner_4/Text.dat
Eingabe/Ordner_5/Text.dat
Eingabe/Ordner_6/Text.dat
Eingabe/Ordner_7/Text.dat
Eingabe/Ordner_8/Text.dat
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der TE arbeitet mit Python 2.7, das hat er frueher schon mal erwaehnt. Damit geht der format-String nicht, und es muss

Code: Alles auswählen

print("Eingabe/Ordner_{}/Text.dat".format(i))
heissen.
BatsillasD
User
Beiträge: 30
Registriert: Mittwoch 6. November 2019, 13:42

Vielen Dank für Eure bisherige Hilfe, mein Programm sieht aktuell so aus:

Code: Alles auswählen

ordner = "Eingabe/Ordner_i/Text.dat"   
if __name__ == "__main__":
     
    
        for i in xrange(1,9):
    
            f = open('ordner','r')  
            print('Eingabe/Ordner_i/Text.dat'.format(i))  
Nun gibt es dabei offensichtlich irgendwelche Probleme, die ich nicht wirklich identifizieren kann. Das sieht in der Shell so aus:
Traceback (most recent call last):
File "plot.py", line 72, in <module>
f = open('ordner','r')
IOError: [Errno 2] No such file or directory: 'ordner'
Könnt Ihr erkennen wo der Feher liegt?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@BatsillasD: ich wiederhole mich gerne: bei Dir fehlen noch die Grundlagen, was literale Strings sind und was Variablen. In Strings werden nicht auf magische Weise Teile, die wie Variablennamen aussehen, durch den Wert dieser Variablen ersetzt.
BatsillasD
User
Beiträge: 30
Registriert: Mittwoch 6. November 2019, 13:42

Sirius3 hat geschrieben: Freitag 15. November 2019, 13:00 @BatsillasD: ich wiederhole mich gerne: bei Dir fehlen noch die Grundlagen, was literale Strings sind und was Variablen. In Strings werden nicht auf magische Weise Teile, die wie Variablennamen aussehen, durch den Wert dieser Variablen ersetzt.
und wo kann man das so nachlesen, dass man es als Anfänger versteht? Irgendwie habe ich das Gefühl, dass Sie immer nur betonen was der Fragende nicht kann. Im besten Fall sagen Sie dann noch was falsch ist. Das hilft wirklich niemandem, der irgendwas lernen will. Gebe mir viel Mühe, aber als Neueinsteiger ist das nunmal nicht leicht.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Nachlesen kannst du in der Python Dokumentation diese ist allerdings für Version 3.x. Aber String mit der .format() Methode sind dort auch thematisiert. Wenn du daraus auch nicht schlau wirst, dann google einfach "Python .format()" und du wirst genügend Beispiele finden.
Benutzeravatar
__blackjack__
User
Beiträge: 14050
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@BatsillasD: In der Python-Dokumentation gibt es ein Grundlagentutorial.

Das man Bezeichner und Zeichenkettenliterale nicht einfach so durcheinanderwerfen kann, weil das zwei verschiedene Dinge sind, sollte einem aber auch der gesunde Menschenverstand sagen. Das irgend etwas innerhalb einer literalen Zeichenkette das es auch ausserhalb als Bezeichner gibt, nicht auf magische Weise in der Zeichenkette durch Wert ersetzt wird, der an den Bezeichner gebunden ist, sollte man sich auch denken/erarbeiten können. Denn das würde ja bedeuten, dass man dann in den Zeichenketten nichts mehr verwenden kann was ausserhalb auch als Name existiert, oder dass der Rechner die Gedanken des Programmierers lesen können muss, wann der denn gerne Namen ersetzt haben möchte und wann nicht. Aus "Eingabe/Ordner_i/Text.dat" würde dann ja bei i=1 ein "E1ngabe/Ordner_1/Text.dat" oder Du müsstest mal erklären können warum der Rechner wissen sollte das er das eine "i" ersetzen sollte und das andere nicht.

Auch bei der `format()`-Methode so wie Du sie nach dem `open()` stehen hast, wird das so nicht funktionieren, denn da stellt sich doch die gleiche Frage: Woher soll der Rechner/Python/die `format()`-Methode hier wissen *was* in der Zeichenkette durch den Wert von `i` ersetzt werden soll? Rechner sind dumm. Wirklich saudumm. Die machen genau was man ihnen sagt, nicht was man eigentlich meinte. Ein Mensch der ein bisschen mitdenkt weiss natürlich sofort was Du da erreichen willst. Rechner denken aber nicht mit. Die arbeiten stur das ab was da steht, nach sehr starren Regeln. Ob das am Ende ein sinnvolles Ergebnis bringt oder nicht.

Neben dem/einem Tutorial wird man dann auch nicht umhin kommen in der Dokumentation nachzulesen was die einzelnen Syntaxkonstrukte bewirken, und Funktionen und Methoden machen. Zum Beispiel die Regeln was `format()` mit der Zeichenkette und den übergebenen Werten anstellt.

Und das wird seine Zeit dauern. Das schafft man sich nicht mal eben in 10 Minuten drauf, da sollte man schon ein paar Tage für einplanen, und da dann wirklich dran arbeiten. Also nicht nur unter dem Blickwinkel, dass man möglichst wenig Zeit damit verbringen möchte und nur Sachen lernen möchte die man unmittelbar für die Aufgabe braucht. Denn a) weiss man das ja noch gar nicht, was man braucht und was nicht, und b) muss man den gesamten Grundlagen”baukasten” kennen, um dann gezielt die Teile und Werkzeuge auswählen zu können die man für die Lösung braucht. Die Grunddatentypen und deren Operationen/Methoden und die Kontrollstrukturen sind Voraussetzung um sinnvoll Programme schreiben zu können.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten