Python & Wildcards

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.
Benutzeravatar
Frau_U
User
Beiträge: 16
Registriert: Dienstag 13. April 2010, 18:15

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]
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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.
Benutzeravatar
Frau_U
User
Beiträge: 16
Registriert: Dienstag 13. April 2010, 18:15

bei glob.glob("*.png") bekomme ich in der Konsole nur die Ordnernamen zu sehen :-(
BlackJack

@Frau_U: Wenn Du die Verzeichnisnamen nicht ausgegeben haben willst, dann solltest Du sie halt nicht ausgeben. Zeile 4 in dem gezeigten Quelltextausschnitt!?
Benutzeravatar
Frau_U
User
Beiträge: 16
Registriert: Dienstag 13. April 2010, 18:15

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 :-(
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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 ;)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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")))
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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 ;-)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

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:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
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.
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

@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
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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...)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
BlackJack

@ms4py: "Völlig" ist vielleicht übertrieben. Man kann sich mit `partial()` eine Funktion daraus basteln, die man zum `filter()`\n verwenden kann. :-)
Benutzeravatar
Frau_U
User
Beiträge: 16
Registriert: Dienstag 13. April 2010, 18:15

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'
Antworten