Seite 1 von 2

Zerlegung mit Trennzeichen

Verfasst: Montag 27. August 2007, 07:21
von xwastedyouthx
hallo zusammen,

ich versuche einzelne elemente aus einer ausgelesenen datei zu verarbeiten.
genauer gesagt dateinamen die wie folgt gespeichert sind

Code: Alles auswählen

['blabla.txt', 'test']
['blablablabla.txt', 'nocheine.txt']
['neuedatei.cpp']
hier steht jetzt jede zeile für einen ordner und dessen inhalt.
im ersten ordner sind also die dateien blabla.txt und test
im letzen neudatei.cpp

wir bekomme ich das[' am anfang und das '] am ende weg ?
wie zerlege ich dann eine zeile mit dem trennzeichen "," ?

stringzerlegung ist mir nur in der theorie ein begriff, wie ich das in python umsetze weiss ich leider nicht.

für euch ist das bestimmt ein kinderspiel. :roll:

Verfasst: Montag 27. August 2007, 08:25
von Y0Gi
Dein Datenbeispiel scheint gültiges YAML und wohl auch JSON zu sein, mit einem entsprechenden Parser (z.B. PyYAML, simplejson) kannst du das also sauber und einfach einlesen.

Verfasst: Montag 27. August 2007, 08:27
von Rebecca

Code: Alles auswählen

In [8]: line =  "['blabla.txt', 'test']"
In [9]: l = line.strip("[]") #Klammern weg
In [10]: files = l.split(", ") #Am Komma + Leerzeichen trennen
In [11]: files
Out[11]: ["'blabla.txt'", "'test'"]
In [15]: files2 = [i.strip("'") for i in files] #Hochkommata weg
In [16]: print files2
['blabla.txt', 'test']

Verfasst: Montag 27. August 2007, 09:44
von BlackJack
Wobei sich mir die Frage stellt, wie die Daten in diesem Format in die Datei gekommen sind. Falls Du das selbst in der Hand hattest/hast wandle nicht einfach Listen in Zeichenketten um, sondern benutze das `csv`-Modul zum schreiben und lesen. Das spart eine Menge Arbeit, insbesondere wenn "komische" Zeichen in den Dateinamen vorkommen. Bei den meisten Dateisystemen ist zum Beispiel ein "newline" ein gültiges Zeichen in Dateinamen!

Verfasst: Montag 27. August 2007, 10:51
von xwastedyouthx
danke schonmal für die denkanstösse.
der tip von rebecca hat mich auf die richtige fährte gebracht.
durch strippen und replacen habe ich jetzt pro zeile einen datei-namen.

die datei lese ich ein mit os.walk

wie kann ich denn das ganze mit dem csv modul vereinfachen?

Verfasst: Montag 27. August 2007, 11:00
von BlackJack
Mit `os.walk()` liest man keine Dateien. Also nochmal ganz langsam: Wo kommen die Daten her?

Zum `csv`-Modul gibt's eine Doku.

Verfasst: Montag 27. August 2007, 11:58
von xwastedyouthx
achso , ööhm, also mit dem os.walk lese ich alle dateinamen aus die in einem ordner sind, und diese werden dann eben in die datei geschrieben.

die ausgabe von dem os.walk() ist dann eben:
['bla.txt', 'blabla.txt']


usw.

Verfasst: Montag 27. August 2007, 12:34
von The Spirit
was willst du denn weiter mit den dateinamen machen?
benötigst du diese als variablen oder so in deinem script?

Verfasst: Montag 27. August 2007, 13:01
von xwastedyouthx
alle dateien mit einer bestimmten endung sollen geöffnet werden.
es soll dann nach einem bestimmten stichwort gesucht werden.

Verfasst: Montag 27. August 2007, 13:30
von The Spirit
xwastedyouthx hat geschrieben:alle dateien mit einer bestimmten endung sollen geöffnet werden.
es soll dann nach einem bestimmten stichwort gesucht werden.
nach einem stichwort in den files oder im dateinamen?

Verfasst: Montag 27. August 2007, 13:40
von xwastedyouthx
in den files!!
jede öffnen und nach dem stichwort suchen :)
und wenn das wort vorhanden ist den dateinamen ausgeben...

Verfasst: Montag 27. August 2007, 13:55
von Leonidas
Wozu speicherst du denn dann die Ausgabe von ``os.walk()`` in einer Datei?

Du musst doch einfach nur ``os.walk()`` benutzen, dann die gefundenen Elemente durchiterieren und die Betreffenden dateien öffnen um darin zu suchen. Kein Bedarf irgendetwas in irgendwelche Dateien reinzuschreiben.

Verfasst: Montag 27. August 2007, 14:08
von xwastedyouthx
das problem ist, dass der os.walk pro ordner einen string ausgibt mit allen vorhandenen dateien. ich habe es bist jetzt nicht hinbekommen aus diesem einen die dateinamen zu seperieren.
als notbehelf habe ich das ganze jetzt so gestrickt das zuerst eine liste mit vorhandenen dateinamen erzeugt und in eine datei geschrieben wird.
jede zeile ist also eine datei!!!



also blutiger anfänger wusste ich mir nicht anders zu helfen.

für profi-tips bin ich natürlich offen :)

Verfasst: Montag 27. August 2007, 14:48
von BlackJack
Der Profi-Tipp ist: Arbeite das Tutorial durch. `os.walk()` liefert dir keine Zeichenkette mit den Dateinamen sondern eine Liste.

Verfasst: Montag 27. August 2007, 16:33
von Y0Gi
Woher die Daten nun eigentlich kommen, hast du aber *immer* noch nicht offenbart, oder?

Verfasst: Dienstag 28. August 2007, 06:57
von xwastedyouthx
hmm.ich glaube ich hab sogar eine liste.
warum ich die bisher nicht benutzt habe weiss ich auch nicht. :)
muss ich gleich mal probieren.


daher kommen die daten:

Code: Alles auswählen

for root, dirs, files in os.walk('c:/test'):

                                                       liste.insert(i,files)

Verfasst: Dienstag 28. August 2007, 07:00
von BlackJack
Was ist `i` in diesem Fall und bist Du sicher dass Du nicht einfach `append()` statt `insert()` benutzen kannst?

Verfasst: Dienstag 28. August 2007, 07:21
von xwastedyouthx
das i war mein counter, aber der fällt jetzt mit append weg. danke

nun habe ich aber pro eintrag in der liste zeilen die zb so aussehen:

Code: Alles auswählen


['hallo.txt', 'du.txt', 'affe.txt']

ich brauch aber die dateien einzeln.

jeder eintrag in diser zeile sollte eigentlich ein eintrag in einer liste sein:
hallo.txt also erster eintrag
du.txt als zweiter
affe.txt als dritter.

Verfasst: Dienstag 28. August 2007, 07:45
von BlackJack
Das was Du da hast *ist* eine Liste mit den geforderten Eigenschaften.

Falls Du keine Liste mit Listen, sondern eine Liste mit allen Dateinamen haben möchtest, dann suchst Du `extend()` statt `append()`.

Die Namen haben alle keine Pfadinformation, eventuell solltest Du mit `os.path.join()` den Pfad (`root`) zu den Dateien vor den Namen hängen.

Verfasst: Dienstag 28. August 2007, 09:53
von xwastedyouthx
okeh, soweit so gut..alle gewünschten dateien sind in meiner liste.
jetzt muss ich nur noch die pfadangabe dazubekommen.