Seite 1 von 2
Liste mit Dateinamen (ls *.ext)
Verfasst: Sonntag 29. März 2009, 14:26
von whaeva
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).
Verfasst: Sonntag 29. März 2009, 14:33
von fred.reichbier
Du könntest auch
glob verwenden.
Verfasst: Sonntag 29. März 2009, 14:42
von cofi
Deine re-Überprüfung macht man am besten mit `.endswith(ext)'
Verfasst: Sonntag 29. März 2009, 15:25
von whaeva
Sehr aufschlußreich, danke. Habe das Rad wohl neu erfunden. Werde glob() benutzen.
Verfasst: Sonntag 29. März 2009, 15:36
von 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']
Verfasst: Sonntag 29. März 2009, 18:15
von fred.reichbier
Hm. Dann vielleicht
fnmatch?
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']
Verfasst: Sonntag 29. März 2009, 18:20
von snafu
Mich wundert wirklich, dass `glob`, wo es doch auf `fnmatch`aufbaut, nicht in der Lage ist, Dateien mit Punkt am Anfang zu finden...
Verfasst: Sonntag 29. März 2009, 18:29
von 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.
Verfasst: Sonntag 29. März 2009, 20:50
von Leonidas
Wäre ja auch unpraktisch wenn das Globbing in ``rm *`` auch ``..`` findet und dann den übergeordneten Ordner auch gleich mitlöscht.
Verfasst: Sonntag 29. März 2009, 21:18
von str1442
rm ohne -r löscht keine Ordner

Verfasst: Montag 30. März 2009, 13:31
von Darii
klassischer Fall von:

Verfasst: Montag 30. März 2009, 16:19
von lunar
Da lebt jemand gerne gefährlich ...

Verfasst: Montag 30. März 2009, 18:26
von Hyperion
lunar hat geschrieben:Da lebt jemand gerne gefährlich ...

Wärs so nicht noch gefährlicher?

Verfasst: Montag 30. März 2009, 18:30
von 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

Verfasst: Montag 30. März 2009, 18:41
von Hyperion
Also nen Kumpel von mir hatte sich mal vor zig Jahren vertippt als er in "/" war:
Man beachte das böse Leerzeichen
Seit dem navigiert er vor solch einem Vorgang deutlich vorsichtiger

Verfasst: Donnerstag 7. Mai 2009, 10:23
von whaeva
Gehört nicht direkt zur Fragestellung, aber:
Einem Skript möchte ich als Argument Dateien mit Wildcard verklickern, z.B.:
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
Was genau passiert da und wie vermeidet man es?
Verfasst: Donnerstag 7. Mai 2009, 10:39
von EyDu
*.ext wird zunächst von deiner Shell bearbeitet und damit natürlich durch die entsprechenden Dateien ersetzt. Versuch einfach mal:
Verfasst: Donnerstag 7. Mai 2009, 10:48
von 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.
Verfasst: Donnerstag 7. Mai 2009, 11:11
von whaeva
Danke, habe mein Problem erkannt:
* wird von der Shell zu "file1 file2 file3" umgebaut - argv >> ['file1', 'file2' ,'file3']
Verfasst: Donnerstag 7. Mai 2009, 12:51
von Rebecca
Hyperion hat geschrieben:
Oh ja...
