Mehrere Files laden

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
sirisunshine
User
Beiträge: 5
Registriert: Mittwoch 30. April 2014, 09:59

Hey Leute,
ich hätte da mal wieder ein Problem.

Ich würde gern mehrere Text files einlesen.

Code: Alles auswählen

fobj_in = open("Test.txt", "r")
Einen zu öffnen is ja recht einfach aber wie sieht das aus, wenn man zum Beispiel mehrere Ordner in einem Ordner hat und in jedem Ordner sind mehrere Dateien unter anderem auch die benötigten txt Dateien.

Kann man irgendwie zum Beispiel den Zielordner angeben und einen Code schreiben, der die Ordner nach den txt Dateien durchsucht und sie Automatisch öffnet wenn er welche findet?

Grüße
BlackJack

@sirisunshine: Schau Dir mal die `os.walk()`-Funktion an.
sirisunshine
User
Beiträge: 5
Registriert: Mittwoch 30. April 2014, 09:59

Jut hab ich gemacht und funktioniert auch.

Code: Alles auswählen

import os

for root, dirs, files in os.walk("C:\Users\Name\Downloads\Dateien"):
    for file in files:
        if file.endswith(".txt"):

             print file
Aber ich will ja das er auch Alle Textdateien nacheinander einließt und als print ausgibt. Bis jetzt gibt er mir ja nur die Namen der txt Dateien aus die er gefunden hat.

z.B.

Code: Alles auswählen

[Dbg]>>>
Test1.txt
Test2.txt
Test3.txt
.
.
.
Ich brauch Alle Inhalte aus den Dateien nacheinander als print ausgegeben.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Um Dich zu zitieren:
sirisunshine hat geschrieben:Einen zu öffnen is ja recht einfach
Beim Programmieren besteht die Lösung eines komplexen Problems immer aus der Kombination von einfachen Lösungen.
ps: Du brauchst noch `os.path.join`.
boletus999
User
Beiträge: 25
Registriert: Dienstag 27. August 2013, 07:04

So z.B.
wobei dein Zeilenumbruch und die Zeilenelemente noch getrennt werden müssen

Code: Alles auswählen

    import os
     
    for root, dirs, files in os.walk("C:\Users\Name\Downloads\Dateien"):
        for file in files:
            if file.endswith(".txt"):
                 file = os.path.join(root, file)
                 file = open(file, "r")
                
                 print file.read().split(.............
Alternative mit fnmatch:

Code: Alles auswählen

    import os
    import fnmatch
 
    for root, dirs, files in os.walk("C:\Users\Name\Downloads\Dateien"):
        for file in files:
            pattern = "*.txt"
            if fnmatch.fnmatch(file, pattern):
                 file = os.path.join(root, file)
                 file = open(file, "r")

                 print file.read().split(................
Theory is when you know everything but nothing works.
Practice is when everything works but no one knows why.
In my office, theory and practice are combined:
nothing works and no one knows why.
BlackJack

Vielleicht sollte man den Namen `file` nicht an so viele verschiedene Werte mit verschiedenen Typen binden. Das wird ein wenig unübersichtlich. Wobei der ursprüngliche Wert damit schon falsch benannt ist, weil es keine Datei sondern ein Dateiname ist. Und `file` ist auch im Grunde schon vergeben für den Datentyp `file`.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sirisunshine hat geschrieben:

Code: Alles auswählen

for root, dirs, files in os.walk("C:\Users\Name\Downloads\Dateien"):
Das funktioniert jetzt nur zufällig da ein Backslash eine Escape-Sequenz einleitet. Bei der aktuellen Kombination ist das unkritisch, aber wenn der Pfad zum Beispiel "C:\Users\name\Downloads\Dateien" heißen würde (man beachte das kleine "n"), dann schlüge die Routine fehl. Der Grund dafür ist, dass "\n" ein einzelnes Zeichen im resultierenden String ergibt, nämlich das Newline-Zeichen.

Es gibt drei Möglichkeiten, das Problem zu umgehen:

Code: Alles auswählen

# doppelte Backslashes (die im String selber dann zu einem Backslash werden)
for root, dirs, files in os.walk("C:\\Users\\Name\\Downloads\\Dateien"):

# ein Raw-String, in dem der Backslash kein Escape-Zeichen ist
for root, dirs, files in os.walk(r"C:\Users\Name\Downloads\Dateien"):

# Forward-Slashes (ja, die funktionieren auch unter Windows)
for root, dirs, files in os.walk("C:/Users/Name/Downloads/Dateien"):
boletus999
User
Beiträge: 25
Registriert: Dienstag 27. August 2013, 07:04

oder man macht es Unabhängig des BS.

Code: Alles auswählen

...
raw =  os.path.join(os.path.expanduser("~"), "Downloads", "Dateien")
for root, dirs, files in os.walk(raw):

@BlackJack done!

Code: Alles auswählen

import os
 
   
    for path, subdirs, files in os.walk(raw):
        for name in files:
            if name.endswith(".txt"):
                 file = open(os.path.join(path, name), "r")
                               
                 print file.read().split(.............
 
Zuletzt geändert von boletus999 am Mittwoch 7. Mai 2014, 15:38, insgesamt 2-mal geändert.
Theory is when you know everything but nothing works.
Practice is when everything works but no one knows why.
In my office, theory and practice are combined:
nothing works and no one knows why.
BlackJack

@boletus999: Wozu ist das ``os.path.dirname(__file__)`` dabei gut?

Edit: Nee, nicht wirklich done. `f` ist kein guter Name und `file` wird immer noch für zwei verschiedene Dinge verwendet - den kompletten Pfad und kurz danach das Dateiobjekt.
boletus999
User
Beiträge: 25
Registriert: Dienstag 27. August 2013, 07:04

@BlackJack
Danke!!

weil ich schon wieder "absolut" in der "Relation" gedacht habe. :lol:

Das "os.path.dirname(__file__)" kann natürlich weg, außer man steht auf "os.path.abspath(...)" so wie ich.

ich habe es oben korrigiert.
Theory is when you know everything but nothing works.
Practice is when everything works but no one knows why.
In my office, theory and practice are combined:
nothing works and no one knows why.
sirisunshine
User
Beiträge: 5
Registriert: Mittwoch 30. April 2014, 09:59

Sehr Geil Jungs,

Danke für eure Hilfe. Hat alles hingehauen.
Die os.path.join(path,file) Funktion kann Alles.

Vielen Dank nochmal

Grüße
Siri
Antworten