Seite 1 von 1

Mehrere Dateien einlesen

Verfasst: Sonntag 30. Januar 2005, 21:30
von domiii
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.

Verfasst: Sonntag 30. Januar 2005, 22:17
von XT@ngel
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

tja

Verfasst: Sonntag 30. Januar 2005, 22:21
von domiii
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

Verfasst: Sonntag 30. Januar 2005, 22:45
von XT@ngel
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

Verfasst: Montag 31. Januar 2005, 00:49
von Dookie
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

Verfasst: Montag 31. Januar 2005, 13:31
von Leonidas
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.

Verfasst: Montag 31. Januar 2005, 13:40
von Dookie
Hi Leonidas,

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


Gruß

Dookie

Verfasst: Montag 31. Januar 2005, 13:46
von Leonidas
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?

Verfasst: Montag 31. Januar 2005, 13:54
von Dookie
| 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

Verfasst: Montag 31. Januar 2005, 14:03
von Leonidas
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?

Verfasst: Montag 31. Januar 2005, 15:57
von BlackJack
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/...'))

Verfasst: Montag 31. Januar 2005, 16:00
von Dookie
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 ;)

Verfasst: Montag 31. Januar 2005, 16:38
von Leonidas
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 ;)