Mehrere Dateien einlesen

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
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Hallo miteinander

Ich habe ein Skript, das mehrere, nacheinander aufzurufende Dateien verarbeiten soll. Das Skript habe ich so aufgebaut, dass der Dateiname jeweils mitgegeben werden muss.
Ich habe mir das "egrep-mässig" vorgestellt; dass man also sowas wie "python skript.py *.txt" aufrufen kann. Ist das möglich? Wie?
Oder muss man das Skript innerhalb von der python-Konsole aufrufen und dann von dort aus alle Dateien (via for-Schleife) ausführen lassen?

Danke,
Marcel
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du kennst doch ``sys.args``, oder nicht? Benutze einfach diese Liste! Der Aufruf ``executable *.foo`` wird von der jeweiligen Shell *expandiert*, d.h. in Wirklichkeit sieht der Aufruf so aus:

Code: Alles auswählen

executable 1.foo 2.foo 3.foo ... x.foo
(eben mit allen Dateien, die in dem Verzeichnis liegen und auf die das Muster passt)

Diese werden Deinem Python-Programm in ``sys.args`` zur Verfügung gestellt.

Für weiter führende CLI-Dinge sei Dir aber wärmstens ``argparse`` ans Herz gelegt!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Das verstehe ich nicht ganz.
Also soll ich in der Shell die Liste benutzen? [dann hätte ich es so verstanden, dass ich einfach alle Dateien im Verzeichnis suche, und die dann in einer for-Schleife mit dem Skript ausführe]
Oder wie hast du das gemeint?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Nee, du sollst einfach mal ein Script schreiben, dieses mit ``python script.py *.txt`` aufrufen und schauen, was in ``sys.args`` steht. Natürlich sollte es auch ein paar Textdateien im Verzeichnis geben. Dann kommst du schon selber auf deine Lösung ;-)
Das Leben ist wie ein Tennisball.
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Würde gehen mit "os.system", "os.startfile" oder mit "subprocess.call".

Code: Alles auswählen

http://docs.python.org/2/library/os.html
Einfach mal googlen ;)
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dami123 hat geschrieben:Würde gehen mit "os.system", "os.startfile" oder mit "subprocess.call".
Warum empfiehlst du os.system wenn in der Dokumentation dazu explizit mit den Worten "[...] using that module is preferable to using this function" auf das subprocess-Modul verwieden wird?
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Hab einfach mal paar Beispiele genannt. Hab deswegen auch die Wiki gepostet und wer lesen kann ist klar im Vorteil sonst muss er eben mit "os.system" auskommen 8)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dami123 hat geschrieben:Hab einfach mal paar Beispiele genannt. Hab deswegen auch die Wiki gepostet und wer lesen kann ist klar im Vorteil sonst muss er eben mit "os.system" auskommen 8)
Beispiele wofür? Und was für ein wiki?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Beispiele zum ausführen von Dateien und die wiki bzw. doku für "os" -> http://docs.python.org/2/library/os.html
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Also das mit sys.args verstehe ich noch nicht ganz. Wie soll das genau gehen?
Angenommen mein Modul wird so aufgerufen: "python code.py test.txt"

Ich habs mal noch mit einem Skript mit normalen statements probiert. Würde das auch gehen, oder ist das nicht so "gut"? :

Code: Alles auswählen

import glob

files = glob.glob('./texte/*.txt')
for f in files:
	buch = open(f)
	./code.py buch
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

MarcelF6 hat geschrieben:Also das mit sys.args verstehe ich noch nicht ganz. Wie soll das genau gehen?
Angenommen mein Modul wird so aufgerufen: "python code.py test.txt"
Hast Du das mit * wirklich probiert? Die * sind Shellmagie, d.h. das aufgerufene Programm sieht den Stern nicht, da die Shell aus dem Stern eine Liste von Argumenten macht, welche z.B. für Python in sys.argv landen.
MarcelF6 hat geschrieben:Ich habs mal noch mit einem Skript mit normalen statements probiert. Würde das auch gehen, oder ist das nicht so "gut"? :
Den Code hast Du probiert? Mit Shellthon? :roll:
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Also kann ich ganz simpel folgendes ausführen:

Code: Alles auswählen

python code.py *.txt
...und mein Code (code.py) wird "automatisch" für alle .txt-Files ausgeführt?
Besten Dank,
Marcel
BlackJack

@MarcelF6: Nein. Schau Dir doch einfach mal an was `code.py` in `sys.argv` übergeben bekommt, wenn Du es so aufrufst.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Mit diesem Aufruf habe ich dann zB in sys.argv[1] der Name meiner ersten Datei.
Soweit, so gut. Nun muss ich aber trotzdem in einer for-Schleife über alle Einträge gehen, oder gibt es da einen einfacheren Weg?
Besten Dank für die Hinweise.
BlackJack

@MarcelF6: Was soll es da denn noch einfacheres geben? Das Python selbst mitdenkt und richtig rät das es sich um Dateinamen handelt und was genau damit gemacht werden soll?
Antworten