Text mit \n in eine Liste für "for i in ..." über

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
egerlach
User
Beiträge: 43
Registriert: Samstag 14. März 2009, 21:32

Hallo,
als Rückgabe von einem Linux-Bash-Befehl erhalte ich in python eine Variable zurück, die mit "print" ausgedruckt so aussieht:

/home/test/text.ab.2
/home/test/text.ab.1
/home/test/text.ab

Ich will nun in einer for-Schleife diese Dateien mit Pfad weiter bearbeiten. Wie konvertiere ich den Text in der Variable in eine Liste, mit der for zurechtkommt?
Von mir probiert:

Code: Alles auswählen

print dateiListe
for i in dateiListe:
    print i
Die python-Ausgabe dieser print-Befehle, es werden in diesem Beispiel 3 Dateien text.ab.2, text.ab.1 und text.ab gefunden:

Code: Alles auswählen

/home/test/text.ab.2
/home/test/text.ab.1
/home/test/text.ab


/
h
o
m
e
/
t
e
s
t
/
t
e
x
t
[...]

Was ist insgesamt mache:

Code: Alles auswählen

cmd = "ls /home/text.ab* -tr"
p = subprocess.Popen(cmd, shell=True, #bufsize=1,
                               stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.stdin.close()
dateiListe=p.stdout.read()

print dateiListe
for i in dateiListe:
    print i
    # hier weitere Verarbeitung der gefundenen Dateien, hier beispielhaft 3 Dateien, mindestens ist eine Datei vorhanden.
gruss
Eckard
nuss
User
Beiträge: 53
Registriert: Donnerstag 28. August 2008, 11:36

Musst du den Bash-befehl benutzen? oder kannst du eventuell auch einfach einen python befehl nutzen, um an diese Dateinamen ranzukommen?

Du hast also den Text als einen String vorliegen, der dann in etwa so aussehen dürfte ?

Code: Alles auswählen

"/home/test/text.ab.2\n/home/test/text.ab.1\n/home/test/text.ab\n"
wenns echt nicht anders geht als über nen bash befehl,
dann mach's so:

Code: Alles auswählen

for i in dateiListe.split("\n"):
    print i
wenn du allerdings nur an die Dateinamen in einem ordner rankommen möchtest,
dann gibts schönere wege, z.b.

Code: Alles auswählen

import dircache
for i in dircache.listdir("ordnerpfad")
    print i
sehr praktisch ist auch das os modul.

achso, es sieht um einiges schöner aus, wenn du code=python schreibst, statt einfach nur code ;)

edit: habs den 2ten teil garnicht richtig gelesen.
das kannst du auf jedenfall leichter haben.

Code: Alles auswählen

import os
import dircache
for f in dircache.listdir("/home"):
    if f.startswith("text.ab"):
        print f
(ungetestet)
egerlach
User
Beiträge: 43
Registriert: Samstag 14. März 2009, 21:32

Nein, ein bash-Befehl muss es wirklich nicht sein!
nuss hat geschrieben:

Code: Alles auswählen

import os
import dircache
for f in dircache.listdir("/home"):
    if f.startswith("text.ab"):
        print f
Jetzt getestet! Geht! Besten Dank!

Ja, gerne schreibe ich hinter code= python, ich habe mich schon über das Gleichheitszeichen gewundert, was das soll ;-)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

[mod]dircache[/mod] ist deprecated und ab Python 3.0 nicht mehr vorhanden. Denn es gibt ja auch [mod]glob[/mod]:

Code: Alles auswählen

In [1]: from glob import glob

In [2]: glob('/home/sebastian/text.ab*')
Out[2]: ['/home/sebastian/text.abd', '/home/sebastian/text.abc']
Antworten