for i in listdir(getcwd()):

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.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Guten Tag zusammen
Ich versuche folgenden Code zum laufen zu bringen. In eine Liste sollen nur Pfade von Dateien geschrieben werden, die zur Kondition passen. Der Name der gesuchten Files ist vom Typ 'pol-*.arc'.

Code: Alles auswählen

#!/usr/bin/env python

# NOTE:
# Append files to the filesList if the name starts with 'pol' and
# the extension is '.arc'.
import os, sys 
from os.path import splitext, abspath
from os import getcwd, listdir

polFilesList = []

# Generate a list of the files.
for i in listdir(getcwd()):
    if i.split('-')[0] == 'pol' and abspath(i).split('.')[1] == '.arc':
        polFilesList.append(i)

print polFilesList
Ich kriege eine Meldung, splitext() ist nicht auf Strings definiert. Klar, gut. Was kann ich machen? i nach 'path' typecasten? Ich kann mich nicht mehr erinnern, wie ich das sonst manchmal gemacht habe.

Vielen Dank für Hinweise.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Schau Dir doch mal das glob-Modul an :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@mzh: Ansonsten liegt hier wohl ein Missverständnis bei den Typen vor. Mach Dir klar was `path`, `splitext()`, und `str` ist. "Nach path casten" könnte ich mir jetzt nicht einmal im Ansatz vorstellen was das bedeuten soll.

`i` ist übrigens ein furchtbarer Name für irgend etwas anderes als ganze Zahlen. Insbesondere in einer Schleife.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Ich hab auch keine Ahnung wie nach 'path' casten im Detail genau aussehen soll. Was ich nicht verstehe ist, wie ich splitext() sonst auf einer Liste von Filenamen anwenden soll. Die Files können ja nicht anders als als Strings in die Liste gepackt werden, das kommt wird ja von listdir() vorgegeben.
Ich schaue mal im glob-Modul nach, ich bin aber fast sicher, dass ich diese Art von Aufgabe schon hundertmal gelöst habe. Heute klappts aber nicht ganz.
Ich nenne das 'i' jetzt 'file', klappt leider immer noch nicht. Evlt. hat das Modul 'os.path' ja noch alternative Methoden als 'splitext' zur Verfügung, die auf einem String aufgerufen werden können?
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mzh hat geschrieben: Ich schaue mal im glob-Modul nach, ich bin aber fast sicher, dass ich diese Art von Aufgabe schon hundertmal gelöst habe.
Und das glob-Modul nimmt Dir doch die Arbeit fast ab. Wieso also da selber etwas basteln? Alternativ kannst Du Dir auch noch das fnmatch-Modul angucken.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@mzh: Du hast ja schon richtig gesagt, das `os.path` ein *Modul* ist. Was ist denn `splitext()`? Und wenn Du das weisst, wie wendet man es denn auf eine einzelne Zeichenkette an? Wenn Du das weisst, wie auf jedes Element in einer Liste? Welcher dieser Schritte ist denn genau das Problem?
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Also wenn ich das richtig sehe,

Code: Alles auswählen

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
dann werden die gelisteten Files ja doch wieder als Strings zurück gegeben. Dh. splitext() würde auf einer solchen Ausgabe wieder nicht funktionieren. Ich frag mich gerade, wie ich damals splitext() wirklich verwendet habe. Wenn mich nicht alles täuscht dann über einen 'join(path, file)' Umweg.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mzh hat geschrieben:Also wenn ich das richtig sehe,

Code: Alles auswählen

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
dann werden die gelisteten Files ja doch wieder als Strings zurück gegeben. Dh. splitext() würde auf einer solchen Ausgabe wieder nicht funktionieren. I
Natürlich würde es... wie kommst Du darauf?

Code: Alles auswählen

In [1]: from os.path import splitext

In [2]: splitext(r"card.gif")
Out[2]: ('card', '.gif')
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

mzh hat geschrieben:

Code: Alles auswählen

#!/usr/bin/env python

# NOTE:
# Append files to the filesList if the name starts with 'pol' and
# the extension is '.arc'.
import os, sys 
from os.path import splitext, abspath
from os import getcwd, listdir

polFilesList = []

# Generate a list of the files.
for i in listdir(getcwd()):
    if i.split('-')[0] == 'pol' and abspath(i).split('.')[1] == '.arc':
        polFilesList.append(i)

print polFilesList
Mal abgesehen davon, dass glob wirklich schöner ist, kannst du händisch wie folgt arbeiten:

Code: Alles auswählen

from os import getcwd, listdir
pol_files = [filename for filename in listdir(getcwd()) if filename.startswith('pol-') or filename.endswith('.arc')]
print pol_files
file ist übrigens ein ungünstiger Name für einen Bezeichner, da du damit das built-in file überschreibst.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

/me hat geschrieben:

Code: Alles auswählen

from os import getcwd, listdir
pol_files = [filename for filename in listdir(getcwd()) if filename.startswith('pol-') and filename.endswith('.arc')]
print pol_files
"and" muss hier rein :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hyperion hat geschrieben:"and" muss hier rein :-)
In der Konsole hatte ich es nach dem Test korrigiert - im bereitstehenden Posting nicht. :oops:

Danke für die Korrektur.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Natürlich würde es... wie kommst Du darauf?

Code: Alles auswählen

In [1]: from os.path import splitext

In [2]: splitext(r"card.gif")
Out[2]: ('card', '.gif')
Folgendermassen:

Code: Alles auswählen

>>> files = listdir(getcwd())
>>> for file in files:
...     if file.splitext()[1] == '.arc':
...             arcfiles.append(file)
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in ?
AttributeError: 'str' object has no attribute 'splitext'

[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie kommst Du da drauf, dass splitext() eine Methode eines String-Objektes ist??? ( Dann müßtest Du sie ja auch nicht importieren btw. ;-) )
AttributeError: 'str' object has no attribute 'splitext'
Die Fehlermeldung sagt es doch!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ja, `splitext` ist nunmal keine String-Methode, sondern ueberhaupt keine Methode.
Du musst es schon so nutzen wie Hyperion dir das vorgefuehrt hat.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Hyperion hat geschrieben:Wie kommst Du da drauf, dass splitext() eine Methode eines String-Objektes ist??? ( Dann müßtest Du sie ja auch nicht importieren btw. ;-) )
AttributeError: 'str' object has no attribute 'splitext'
Die Fehlermeldung sagt es doch!
Hm, es ist eher so, dass ich nicht darauf gekommen bin, das listdir(getcwd()) Strings für jede Datei zurück gibt.
Aber jetzt im Ernst, wenn du in einem Verzeichnis 'bild1.gif', 'bild2.gif', 'bild3.gif' hast, dann wird

Code: Alles auswählen

for tmpfile in listdir(getcwd()):
    tmpfile.splitext()
auch bei dir versagen.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Weil es nunmal der voellig falsche Aufruf ist.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

mzh hat geschrieben:Aber jetzt im Ernst, wenn du in einem Verzeichnis 'bild1.gif', 'bild2.gif', 'bild3.gif' hast, dann wird

Code: Alles auswählen

for tmpfile in listdir(getcwd()):
    tmpfile.splitext()
auch bei dir versagen.
Nichts anderes sagt Hyperion doch die ganze Zeit. splitext ist keine Methode des String-Objekts.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mzh hat geschrieben: Hm, es ist eher so, dass ich nicht darauf gekommen bin, das listdir(getcwd()) Strings für jede Datei zurück gibt.
Na das steht doch sogar explizit in der Doku:
os.listdir(path)
Return a list containing the names of the entries in the directory given by path.
Der einzige Stolperstein wäre jetzt noch evtl., was "names" sind. Neben einem einfachen Test in einer Shell sieht man es aber ja auch schon mit ziemlicher Sicherheit durch eine print-Ausgabe.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

/me hat geschrieben:
mzh hat geschrieben:Aber jetzt im Ernst, wenn du in einem Verzeichnis 'bild1.gif', 'bild2.gif', 'bild3.gif' hast, dann wird

Code: Alles auswählen

for tmpfile in listdir(getcwd()):
    tmpfile.splitext()
auch bei dir versagen.
Nichts anderes sagt Hyperion doch die ganze Zeit. splitext ist keine Methode des String-Objekts.
Das ist mir jetzt auch klar. Dh. also um splitext() auf den Dateien eines Verzeichnisses aufzurufen benötige ich die fnmatch-Funktion? Oder wie kann ich das sonst machen?
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, das ist nicht noetig.

Code: Alles auswählen

for tmpfile in listdir(getcwd()):
    name, ext = os.path.splitext(tmpfile)

Code: Alles auswählen

map(os.path.splitext, listdir(getcwd()))
Oder eines der vielen anderen Snippets die jetzt schon gepostet wurden. Wo is das Problem?
Antworten