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
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.
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

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

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: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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]#!/usr/bin/env python
import this[/code]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Leonidas,

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


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

| 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]#!/usr/bin/env python
import this[/code]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
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/...'))
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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]#!/usr/bin/env python
import this[/code]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Antworten