Seite 1 von 2
for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 13:28
von mzh
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.
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 13:34
von Hyperion
Schau Dir doch mal das glob-Modul an

Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 13:59
von 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.
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 14:38
von mzh
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?
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 15:01
von Hyperion
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.
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 15:27
von 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?
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 15:30
von mzh
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.
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 15:32
von Hyperion
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')
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 15:36
von /me
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.
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 15:38
von Hyperion
/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

Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 15:40
von /me
Hyperion hat geschrieben:"and" muss hier rein

In der Konsole hatte ich es nach dem Test korrigiert - im bereitstehenden Posting nicht.
Danke für die Korrektur.
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 15:41
von mzh
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'
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 15:43
von Hyperion
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!
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 15:44
von cofi
Ja, `splitext` ist nunmal keine String-Methode, sondern ueberhaupt keine Methode.
Du musst es schon so nutzen wie Hyperion dir das vorgefuehrt hat.
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 15:53
von mzh
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
auch bei dir versagen.
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 15:59
von cofi
Weil es nunmal der voellig falsche Aufruf ist.
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 16:02
von /me
mzh hat geschrieben:Aber jetzt im Ernst, wenn du in einem Verzeichnis 'bild1.gif', 'bild2.gif', 'bild3.gif' hast, dann wird
auch bei dir versagen.
Nichts anderes sagt Hyperion doch die ganze Zeit.
splitext ist
keine Methode des String-Objekts.
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 17:17
von Hyperion
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.
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 21:26
von mzh
/me hat geschrieben:mzh hat geschrieben:Aber jetzt im Ernst, wenn du in einem Verzeichnis 'bild1.gif', 'bild2.gif', 'bild3.gif' hast, dann wird
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?
Re: for i in listdir(getcwd()):
Verfasst: Montag 8. November 2010, 21:56
von cofi
Nein, das ist nicht noetig.
Code: Alles auswählen
for tmpfile in listdir(getcwd()):
name, ext = os.path.splitext(tmpfile)
Oder eines der vielen anderen Snippets die jetzt schon gepostet wurden. Wo is das Problem?