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.
domiii

Mehrere Dateien einlesen

Beitragvon domiii » Sonntag 30. Januar 2005, 21:30

Hallo,

ich habe mir eine Funktion programmiert um mehrere Dateien einzulesen.

Klappt prinzipiell auch, aber ich bekomme zur Zeit zwei Fehlermeldungen:

1. to mutch files open
2. STOPITERATION

Anbei noch der Code, vielleicht kann mir ja einer helfen???

Code: Alles auswählen

def dateien_lesen (pfad):
    filesnames=os.listdir(pfad) #Liste der Dateien
    file_list=[]
    iter_list=[]
    text_list=[]
    for f in filesnames:
        iter_list.append(iter(file(pfad+f,"r")))
        for iter_f in iter_list:
            text_list.append(iter_f.next())
    return text_list      # und Inhalt zurückgeben



Edit (Leonidas): Code in Python Tags gesetzt.
XT@ngel
User
Beiträge: 256
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Beitragvon XT@ngel » Sonntag 30. Januar 2005, 22:17

Nabend,
wieso hast Du auch so viele Dateien auf einmal geöffnet?
Wieso machts du es nicht so, das du jeweils nur eine Datei öffnest, den Inhalt ausliest und sie dann wieder schliesst.
Und das für jede Datei nacheinander.

MfG
Andreas
domiii

tja

Beitragvon domiii » Sonntag 30. Januar 2005, 22:21

Hi,

gut, das wäre eine alternative.

die funktion soll mir EINE liste mit allen werten aus den verschiedenen dateien geben.

wenn ich wenige dateien nehme, bekomme ich aber die stopiteration meldung immer noch

gruss dominik
XT@ngel
User
Beiträge: 256
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Beitragvon XT@ngel » Sonntag 30. Januar 2005, 22:45

Hier das sollte helfen,

Code: Alles auswählen

def dateien_lesen(pfad);
    # file_list=[] u. iter_list=[]
    # eigentlich unwichtig da eh nur return text_list
    files = os.listdir(pfad)
    text_list = []
    for file_name in files:
        f = open(pfad + file_name, 'r')
        text_list.append(f.read())
        f.close()
    return text_list


Ausprobiert hab ich den Code etzt nicht, aber sollte laufen.
MfG
Andreas
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 31. Januar 2005, 00:49

Hi domiii,

uiuiui ich tippe mal auf C++ oder Javaprogrammierer? ;)

Bei Python verwendet man selten Iteratoren direkt über iter(iterable) und iterator.next() sondern überläßt das einer Forschleife oder einer (eingebauten) Funktion. Dann bekommst du auch keine StopIteration Exception zu sehen, die ja nur anzeigt, daß der Iterator keine weiteren Daten liefern kann.

Wenn ich deinen Code richtig interpretiere, willst Du die Zeilen der Dateien in einer einzigen Liste, das geht am einfachsten wohl so:

Code: Alles auswählen

def dateien_lesen (pfad):
    filesnames=os.listdir(pfad) #Liste der Dateien
    text_list = []
    for fname in filenames:
        f = file(fname, 'r')
        text_list.extend(list(f))
        f.close()
    return text_list

dabei bleiben aber die "\n" an den Zeilenenden erhalten, das kannst du mit einer LC ändern:

Code: Alles auswählen

def dateien_lesen (pfad):
    filesnames=os.listdir(pfad) #Liste der Dateien
    text_list = []
    for fname in filenames:
        f = file(fname, 'r')
        text_list.extend([x.rstrip('\n') for x in f])
        f.close()
    return text_list

Bei Python2.4 kannst du auch eine Generatorexpression nutzen und die Zeile 6 gleich so schreiben:

Code: Alles auswählen

        text_list.extend(x.rstrip('\n') for x in f)



Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 31. Januar 2005, 13:31

Dookie, an dienen Beispielen sehe ich immer wieviel ich noch zu lernen habe.
Was macht .expand() anders als .append()?

Oja, Genereatorexpressions muss ich unbedingt noch lernen einzusetzen, die sind ja richtig nett.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 31. Januar 2005, 13:40

Hi Leonidas,

mit .extend() kannst du eine Liste von werten zu einer Liste hinzufügen, mit .append() nur einzelne Werte.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 31. Januar 2005, 13:46

Wenn ich eine Liste hinzufügen will, nutze ich normalerweise +=, aber .extend() ist wohl schneller. Guter Tipp, das muss ich gleich mal in mein Programm einbauen, dass ich gestern geschrieben habe. Aber .extend() geht nur mit Listen, oder auch mit frozensets()?

Btw: frozenset() (Py 2.4) und sets.ImmutableSet() (Py 2.3) sind doch das gleiche?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 31. Januar 2005, 13:54

| extend(...)
| L.extend(iterable) -- extend list by appending elements from the iterable
sagt Pydoc list
Also sollten auch frozensets gehen. Die dürften das builtinequivalent zu sets.ImmutableSet sein.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 31. Januar 2005, 14:03

Also gleich doppelt so gut geeignet für meine Zwecke als +=. Wunderbar!
Sind in Python 2.4 die Sets aus dem sets Modul auch in C, oder nur die aus den Builtins?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Beitragvon BlackJack » Montag 31. Januar 2005, 15:57

Eine Generatorvariante:

Code: Alles auswählen

def read_files(path):
    for file_name in os.listdir(path):
        a_file = open(file_name, 'r')
        for line in a_file:
            yield line.rstrip('\n')
        a_file.close()


Lässt sich in einer Schleife benutzen, so dass immer nur eine Zeile im Speicher gehalten werden muss, oder auch komplett in eine Liste einlesen:

Code: Alles auswählen

for line in read_files('/foo/...'):
    print line

content = list(read_files('/bar/...'))
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 31. Januar 2005, 16:00

Hi Leonidas,

Code: Alles auswählen

fritz@seneca:~$ ls /usr/lib/python2.4/sets*
/usr/lib/python2.4/sets.py   /usr/lib/python2.4/sets.pyo
/usr/lib/python2.4/sets.pyc

Ein Blick in den sets.py zeigt, das die Sets aus sets ganz normal implementiert sind wie in Pyhton2.2. Also nicht mehr zu empfehlen.


Gruß

Dookie

P.S. das nächstemal schaust selber nach ;)

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 31. Januar 2005, 16:38

Dookie hat geschrieben:Ein Blick in den sets.py zeigt, das die Sets aus sets ganz normal implementiert sind wie in Pyhton2.2. Also nicht mehr zu empfehlen.

P.S. das nächstemal schaust selber nach ;)

Stimmt, hätte ich wohl machen können - beim rumschauen habe ich jetzt festgestellt, dass Sets seit Python 2.3 dabei sind, als PEP 218. Hat's ja richtig gebracht, diese gleich im nächsten größeren Python Release nochmal in C zu schreiben ;)
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]