Liste mit Dateinamen (ls *.ext)

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.
whaeva
User
Beiträge: 66
Registriert: Mittwoch 25. Februar 2009, 15:30

Ich brauche eine Liste mit den Namen aller Dateien bestimmter Endung:

Code: Alles auswählen

#!/usr/bin/python
import sys, os, re, csv
filepath = "data/"
fileext = "csv"
print [f for f in os.listdir(filepath) if os.path.isfile(os.path.join(filepath, f)) and re.search("(.+\.%s)" % (fileext,), f)]
Man könnte noch die Prüfung auf os.path.isfile() einsparen.
Ist das der richtige Weg?

Alternativ ein Systemaufruf mit system oder popen (habe ich nicht im Kopf).
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Du könntest auch glob verwenden.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Deine re-Überprüfung macht man am besten mit `.endswith(ext)'
whaeva
User
Beiträge: 66
Registriert: Mittwoch 25. Februar 2009, 15:30

Sehr aufschlußreich, danke. Habe das Rad wohl neu erfunden. Werde glob() benutzen.
lunar

fred.reichbier hat geschrieben:Du könntest auch glob verwenden.
Dateien, die mit einem Punkt beginnen, werden von glob nicht gefunden:

Code: Alles auswählen

>>> import os
>>> from glob import glob
>>> directory = os.path.expanduser('~')
>>> glob(os.path.join(directory, '*.conf'))
[]
>>> [os.path.join(directory, f) for f in os.listdir(directory) if os.path.splitext(f)[1] == '.conf']
['/home/lunar/.fonts.conf']
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hm. Dann vielleicht fnmatch? :D

Code: Alles auswählen

In [1]: import os

In [2]: import fnmatch

In [3]: directory = os.path.expanduser('~')

In [4]: fnmatch.filter(os.listdir(directory), '*.conf')
Out[4]: ['.test.conf']
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mich wundert wirklich, dass `glob`, wo es doch auf `fnmatch`aufbaut, nicht in der Lage ist, Dateien mit Punkt am Anfang zu finden...
lunar

snafu hat geschrieben:Mich wundert wirklich, dass `glob`, wo es doch auf `fnmatch`aufbaut, nicht in der Lage ist, Dateien mit Punkt am Anfang zu finden...
glob hält sich an die Globbing-Regeln POSIX-kompatibler Shells, daher ist es gewollt, dass der Asterik alle Zeichen außer dem ersten Punkt findet, da das Punkt-Präfix versteckte Dateien kennzeichnet.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wäre ja auch unpraktisch wenn das Globbing in ``rm *`` auch ``..`` findet und dann den übergeordneten Ordner auch gleich mitlöscht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

rm ohne -r löscht keine Ordner :P
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

klassischer Fall von:

Code: Alles auswählen

alias rm = rm -rf
;)
lunar

Da lebt jemand gerne gefährlich ... ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

lunar hat geschrieben:Da lebt jemand gerne gefährlich ... ;)

Code: Alles auswählen

alias rm = sudo rm -rf
Wärs so nicht noch gefährlicher? ;-)
lunar

Gefährlich für was? Für das System mit Sicherheit, die Nutzer-Daten allerdings kann man auch ohne Root-Rechte prima vernichten ;) Ein System kann man schnell wieder neu installieren, aber Daten sind ohne Backups halt einfach weg ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also nen Kumpel von mir hatte sich mal vor zig Jahren vertippt als er in "/" war:

Code: Alles auswählen

rm -r /home/irgendwas/nochwas/ *
Man beachte das böse Leerzeichen :twisted:
Seit dem navigiert er vor solch einem Vorgang deutlich vorsichtiger ;-)
whaeva
User
Beiträge: 66
Registriert: Mittwoch 25. Februar 2009, 15:30

Gehört nicht direkt zur Fragestellung, aber:
Einem Skript möchte ich als Argument Dateien mit Wildcard verklickern, z.B.:

Code: Alles auswählen

script.py *.ext
Dann wäre es ein Leichtes, mit glob(argv[1]) die Liste zu bekommen.

Leider passiert in meiner Shell aber folgendes nicht:

Code: Alles auswählen

argv[1] >> '*.ext'
argv[1] >> 'file1.ext file2.ext ...'
sondern

Code: Alles auswählen

argv[1] >> 'file1.ext'
Was genau passiert da und wie vermeidet man es?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

*.ext wird zunächst von deiner Shell bearbeitet und damit natürlich durch die entsprechenden Dateien ersetzt. Versuch einfach mal:

Code: Alles auswählen

script.py "*.ext"
Das Leben ist wie ein Tennisball.
lunar

Das ist doch unsinnig. Zum einen dupliziert man damit die Arbeit der Shell, zumal diverse Shells wie die zsh weitaus mächtigere Globbing-Features bereitstellen als die "glob()" -Funktion. Zum anderen erschwert man das Escaping: Angenommen, der Nutzer hat eine Datei mit einem Sternchen im Namen. Ruft man "glob()" nochmals manuell auf, muss der Nutzer zweimal Escapen, das erste Mal, um die Shell am Globbing zu hindern, das zweite Mal, um das Programm daran zu hindern.

"glob()" manuell aufzurufen, führt nur zu für den Benutzer unerwarteten Effekten. Anstatt manuell zu globben und der Shell damit ins Handwerk zu pfuschen, sollte man sie einfach ihre Arbeit tun lassen und einfach mit mit der sys.argv()-Liste arbeiten.
whaeva
User
Beiträge: 66
Registriert: Mittwoch 25. Februar 2009, 15:30

Danke, habe mein Problem erkannt:
* wird von der Shell zu "file1 file2 file3" umgebaut - argv >> ['file1', 'file2' ,'file3']
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Hyperion hat geschrieben:

Code: Alles auswählen

rm -r /home/irgendwas/nochwas/ *
Oh ja... :roll:
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Antworten