Seite 1 von 2

Python & Wildcards

Verfasst: Donnerstag 22. April 2010, 07:19
von Frau_U
Hallo Ihr lieben!

Ich habe ein problem mit einer Wildcard!

Ich möchte mir alle Dateien die mit zB. "Schmett" anfangen und ".png" aufhören ausgeben lassen (inkl Dateien in Unterverzeichnissen)

Mein Code bisher:


Code: Alles auswählen


    def pngOut(self):
        print(self.verzeichnis)
        os.path.walk(".", leseVerzeichnisAus , "Test")

# Liest das mitgegebene Verzeichnis aus und selektiert anhand der Wildcard die Dateien, die gesucht werden
# und gibt sie anschließend der Methode schreibePngOutBefehl()
def leseVerzeichnisAus(arg, verzeichnis , datei): 
    pngConvertObjekt = PngConvert(verzeichnis)
    for file in datei:
        if fnmatch.fnmatch(file, "*.png"):
            dateiname = os.path.join(verzeichnis, file)
            print(dateiname)
            
#        pngConvertObjekt.schreibePngOutBefehl(dateiname)
def PngOut befindet sich in der Klasse PngConvert


Die ausgabe sieht allerdings so aus:

.\bilder\schmett
.\bilder\schmett\schmett0
.\bilder\schmett\schmett0\schmetterling.png
.\bilder\schmett\schmett1
.\bilder\schmett\schmett1\schmetterlindg.png
.\bilder\schmett\schmett1\schmetterling.png
.\bilder\schmett\schmett1\schmetterling_front.png
.\bilder\schmett\schmett2
.\bilder\schmett\schmett2\schmettedrling.png
.\bilder\schmett\schmett2\Schmetterling.png
.\bilder\schmett\schmett3
.\bilder\schmett\schmett3\schmetterling.png


Also Ordnername und dann die Dateien.

Kann mir jemand sagen wie ich die Ordnernamen wegbekomme??

Vielen Dank!

[/quote]

Verfasst: Donnerstag 22. April 2010, 07:31
von mkesper
Benutze glob, das macht das für dich, der Pfadtrenner wird dort als solcher respektiert. Du überschreibst übrigens das builtin file, das ist keine gute Idee. file_name wäre vermutlich passender als Bezeichner.

Verfasst: Donnerstag 22. April 2010, 07:48
von Frau_U
bei glob.glob("*.png") bekomme ich in der Konsole nur die Ordnernamen zu sehen :-(

Verfasst: Donnerstag 22. April 2010, 08:15
von BlackJack
@Frau_U: Wenn Du die Verzeichnisnamen nicht ausgegeben haben willst, dann solltest Du sie halt nicht ausgeben. Zeile 4 in dem gezeigten Quelltextausschnitt!?

Verfasst: Donnerstag 22. April 2010, 08:56
von Frau_U
das ist nicht DAS das ausgeben wird. hab ich ja extra schon geschaut. Die Prints sind für mich nur eine kleine Hilfe wo ich gerade stehe.
aber war leider nicht das :-(

Verfasst: Donnerstag 22. April 2010, 09:25
von veers
Das Problem scheint mehr zu sein das glob nicht rekursiv ist.

Code: Alles auswählen

reduce(add,
	(map(partial(os.path.join, p),
		fnmatch.filter(f, "*.jpg"))
	for  p, d, f in os.walk('.')))
dürfte tun ;)

Verfasst: Donnerstag 22. April 2010, 09:37
von ms4py
veers hat geschrieben:Das Problem scheint mehr zu sein das glob nicht rekursiv ist.

Code: Alles auswählen

reduce(add,
	(map(partial(os.path.join, p),
		fnmatch.filter(f, "*.jpg"))
	for  p, d, f in os.walk('.')))
dürfte tun ;)
Das "d" müsste IMO auch noch in das os.path.join?!
Außerdem war es png :P

Verfasst: Donnerstag 22. April 2010, 09:38
von Hyperion
Frau_U hat geschrieben:bei glob.glob("*.png") bekomme ich in der Konsole nur die Ordnernamen zu sehen :-(
Sehr ungewöhnlich:

Code: Alles auswählen

In [8]: from glob import glob

In [9]: glob("*.py")
Out[9]: ['alkohol.py', 'chord.py', 'search.py', 'tennis.py', 'town_crawl.py']

In [10]: ls *.py
 Volume in Laufwerk C: hat keine Bezeichnung.
 Volumeseriennummer: B8D9-0258

 Verzeichnis von C:\Dokumente und Einstellungen\MECL User 1\Eigene Dateien\src\P
ython

22.07.2009  18:39             1.408 alkohol.py
16.07.2008  00:57             6.475 chord.py
18.11.2009  14:22               690 search.py
24.08.2009  17:29             1.883 tennis.py
24.08.2009  16:53            10.486 town_crawl.py
               5 Datei(en)         20.942 Bytes
               0 Verzeichnis(se), 114.885.435.392 Bytes frei
glob hatte ich Dir übrigens schon neulich empfohlen...

Ich persönlich würde ja auf os.walk() zurückgreifen:

Code: Alles auswählen

from glob import glob
import os
from os.path import join as pathjoin

filenames = []

for root, dirs, files in walk("."):
     filenames += (glob(join(root, "*.py")))

Verfasst: Donnerstag 22. April 2010, 09:45
von ms4py
Fix für Hyperions-Version:

Code: Alles auswählen

from glob import glob
import os
from os.path import join as pathjoin

filenames = []

for root, dirs, files in os.walk("."):
     filenames += (glob(pathjoin(root, "*.py"))) 
	 
print filenames
(Das "d" oben benötigt man nicht, habe ich gerade gemerkt.)

Verfasst: Donnerstag 22. April 2010, 09:46
von Hyperion
ms4py hat geschrieben:Fix für Hyperions-Version:
Ah danke, Mist, ich hatte es erst mit "from os import walk" eingebunden... dachte aber stilitisch wäre es so besser :-)

Verfasst: Donnerstag 22. April 2010, 09:51
von veers
ms4py hat geschrieben:
veers hat geschrieben:Das Problem scheint mehr zu sein das glob nicht rekursiv ist.

Code: Alles auswählen

reduce(add,
	(map(partial(os.path.join, p),
		fnmatch.filter(f, "*.jpg"))
	for  p, d, f in os.walk('.')))
dürfte tun ;)
Das "d" müsste IMO auch noch in das os.path.join?!
Außerdem war es png :P
Nein, das d Beinhaltet die Ordner. Die will sie ja nicht matchen.


Hier noch die imports:

Code: Alles auswählen

from operator import add
from functools import partial
import fnmatch
import os
Gruss,
Jonas

Verfasst: Donnerstag 22. April 2010, 10:02
von ms4py
Hyperion hat geschrieben:
ms4py hat geschrieben:Fix für Hyperions-Version:
Ah danke, Mist, ich hatte es erst mit "from os import walk" eingebunden... dachte aber stilitisch wäre es so besser :-)
`pathjoin`war auch noch falsch ;-)

Verfasst: Donnerstag 22. April 2010, 10:20
von Hyperion
ms4py hat geschrieben:
Hyperion hat geschrieben:
ms4py hat geschrieben:Fix für Hyperions-Version:
Ah danke, Mist, ich hatte es erst mit "from os import walk" eingebunden... dachte aber stilitisch wäre es so besser :-)
`pathjoin`war auch noch falsch ;-)
*seufz* Naja, immerhin pädagogisch im Sinne "Finden Sie die Fehler" :-D

Verfasst: Donnerstag 22. April 2010, 13:37
von jonas

Code: Alles auswählen

def starts_ends_with(string, starts, ends):
    if string.find(starts) == 0 and string.endswith(ends):
        return True

Code: Alles auswählen

>>> starts_ends_with(Testname, "Schmett", ".png")
True
Lg, Jonas :wink:

Verfasst: Donnerstag 22. April 2010, 14:10
von Hyperion
jonas hat geschrieben:

Code: Alles auswählen

>>> starts_ends_with(Testname, "Schmett", ".png")
True
Lg, Jonas :wink:
Und nun das ganze bitte für:
- Starte mit "Schmett"
- in der Mitte entweder "foo" oder "bar"
- am ende ".png"

:-D

Ich denke spätestens dann landet man bei RegExps.

Verfasst: Donnerstag 22. April 2010, 15:18
von BlackJack
@jonas: Warum diese Asymmetrie? `find()` statt `startswith()`?

@Frau_U: Ich glaube immer noch die Ordnernamen kommen von woanders aber nicht von dem Quelltext mit dem `glob()`. Das kann einfach nicht sein.

Verfasst: Donnerstag 22. April 2010, 16:39
von jonas
@Blackjack:
Habs wohl einfach übersehen :wink:

Code: Alles auswählen

def starts_ends_with(string, starts, ends):
    if string.startswith(starts) and string.endswith(ends):
        return True
Ich verstehte allerdings noch nicht so 100%, was der Threadersteller haben möchte?

Lg, Jonas

Verfasst: Donnerstag 22. April 2010, 16:45
von ms4py
jonas hat geschrieben:@Blackjack:
Habs wohl einfach übersehen :wink:

Code: Alles auswählen

def starts_ends_with(string, starts, ends):
    if string.startswith(starts) and string.endswith(ends):
        return True
Bitte so:

Code: Alles auswählen

def starts_ends_with(string, starts, ends):
    return (string.startswith(starts) and string.endswith(ends))
(Wobei eine Funktion mit einer Zeile IMO *völlig* unnötig ist...)

Verfasst: Donnerstag 22. April 2010, 17:00
von BlackJack
@ms4py: "Völlig" ist vielleicht übertrieben. Man kann sich mit `partial()` eine Funktion daraus basteln, die man zum `filter()`\n verwenden kann. :-)

Verfasst: Freitag 23. April 2010, 10:21
von Frau_U
Hey Ihr alle!

ich habe es doch noch hinbekommen :-)
Danke für eure hilfreichen Antworten.

Problem ist nur. Ich arbeite mit der Eclipse und nem Python Plugin. Da funktioniert es so wie ich es will.
Aber in der IDLE oder der CMD Dunktioniert mein os.path.walk nicht mehr :-(

Hier mal die Fehlermeldung in der CMD.
Weiß leider nicht wieso er das nicht kennt :-(

PngOpt Objekt wird angelegt und manuelles cv Verzeichnis mitgegeben
Objekt pngConvertObjekt wird angelegt
Objekt statistikObjekt wird angelegt
__init__ statistik
erfolgreich Parameter geprueft
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Frau_U\Desktop\Java_work_new\PngOptimizer\src\OhneKommenatre_PNG_Optimizer.py", line 164, in <module>
pngOpti = PngOpt("C:\\Dokumente und Einstellungen\\Frau_U\\Desktop\\Java_work_new\\PngOptimizer\\src\\bilder\\")
File "C:\Dokumente und Einstellungen\Frau_U\Desktop\Java_work_new\PngOptimizer\src\OhneKommenatre_PNG_Optimizer.py", line 27, in __init__
self.pruefeParameter()
File "C:\Dokumente und Einstellungen\Frau_U\Desktop\Java_work_new\PngOptimizer\src\OhneKommenatre_PNG_Optimizer.py", line 35, in pruefeParameter
self.pngConvertObjekt.pngOut()
File "C:\Dokumente und Einstellungen\Frau_U\Desktop\Java_work_new\PngOptimizer\src\OhneKommenatre_PNG_Optimizer.py", line 87, in pngOut
os.path.walk(self.verzeichnis, leseVerzeichnisAus , "Test")
AttributeError: 'module' object has no attribute 'walk'