*.* etc über Programmparameter?

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.
Antworten
Lvis

Hallo Leute,

ich hab n kleines Script geschrieben (Linux) welches mir automatisch durch auslesen der MP3-Tags die MP3-Dateien umbenennt. Nun will ich aber nicht das Script für jedes File einzelen aufrufen, sondern Zb auch ein *.*, *.mp3 etc zulassen.

Gibts dafür eigne Möglichkeit, dass ALLE möglichkeiten, die die Bash bietet (also *.*, ?, etc) umgesetzt werden ohne dafür selber einen Parser zu schreiben?

Danke schonmal für Eure Hilfe und n frohes und ruhiges Osterfest :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das macht deine Shell schon von sich aus, der Spaß heist ja nicht umsonst Shell Expansion. Also mal zwei Zeilen Code:

Code: Alles auswählen

import sys
print sys.argv

Code: Alles auswählen

$ python shellargs.py *.pyc
['shellargs.py', 'entropy.pyc', 'iopsqrt.pyc', 'mathfun.pyc', 'matrix.pyc', 'ocnprimes.pyc', 'primebench.pyc', 'tkturtle.pyc']
War zwar keine Bash, sondern eine ZSH, aber das Konzept ist das gleiche. Einfach aber praktisch.

Ich wünsch dir auch schöne Ostern.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

Dh heisst wenn ich zB "mp3tag.py *.mp3" aufrufe bedeutet das, dass er das Script xx-mal aufruft, oder wie soll ich das verstehen?
Sorry wenn ich bisschen dumm frage, aber ich habe noch nicht viel in Python gemacht, und da bin ich schonb froh das das kleine Projekt jetzt soweit klappt wie ich mir es vorstelle :)

Weil moemntan nehme ich ja sys.argv[1] oder wars 0? Und dann mache ich n Open-Befehl auf den Variableninhalt!
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

In sys.argv stehen die Argumente, die Du deinem Script übergibst, wobei sys.argv[0] der Name des Scripts selbst ist. Wenn Du das Script so startest wie Leonidas es gezeigt hat, kannst Du z.B. folgendes machen:

Code: Alles auswählen

import sys

for song in sys.argv[1:]:
    print song
Aufrufen mit

Code: Alles auswählen

python scriptname.py *.mp3
Jetzt sollten alle mp3-Files im Verzeichnis ausgegeben werden.

Gruß, mawe
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Lvis hat geschrieben:Hallo Leute,

ich hab n kleines Script geschrieben (Linux) welches mir automatisch durch auslesen der MP3-Tags die MP3-Dateien umbenennt. Nun will ich aber nicht das Script für jedes File einzelen aufrufen, sondern Zb auch ein *.*, *.mp3 etc zulassen.

Gibts dafür eigne Möglichkeit, dass ALLE möglichkeiten, die die Bash bietet (also *.*, ?, etc) umgesetzt werden ohne dafür selber einen Parser zu schreiben?

Danke schonmal für Eure Hilfe und n frohes und ruhiges Osterfest :)
Ich weiß nicht, ob das Plattformübergreifen funktioniert, denn die Auflösung der Name wird unter unixoiden Systemen von der Shell erledigt, d.h. die Shell wandelt das um und gibt dann die aufgelösten Namen an das eigentliche Programm weiter. Unter Win war (ist?) das anders, da muss sich jedes Programm selber darum kümmern.

fs111
Pydoc-Integration in vim - Feedback willkommen: http://www.vim.org/scripts/script.php?script_id=910
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

fs111 hat geschrieben:Ich weiß nicht, ob das Plattformübergreifen funktioniert, denn die Auflösung der Name wird unter unixoiden Systemen von der Shell erledigt, d.h. die Shell wandelt das um und gibt dann die aufgelösten Namen an das eigentliche Programm weiter. Unter Win war (ist?) das anders, da muss sich jedes Programm selber darum kümmern.
Naja, unter Windows ist das unter cmd.exe so, aber ich habe zsh.exe benutzt.
Okay, ich guck mal, dass ich eine Regex-Lösung für dich hinbekomme, die auch das arme cmd.exe schluckt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hier mal ein billiger Versuch (nicht vergessen, ich kann keine Regulären Ausdrücke, also könnten sie etwas buggy sein).

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-
import sys, os, re
regex = sys.argv[1]

# translate Windows "regex" to PCRE
regex = regex.replace('*.', r'.*.')
regex = regex.replace('?', r'.')

files = os.listdir(os.getcwd())
rgx = re.compile(regex, re.IGNORECASE)

def matchregex(f):
    if re.match(rgx, f):
        return True
    else: 
        return False

print filter(matchregex, files)
Ich habe es nur ein wenig getestet, so funtioniert * und ?, aber das war schon alles. Du kannst es aber problemlos erweitern, sollte ja nicht soo schwer sein, ich habs ja auch geschafft.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Meine Güte warum so umständlich... Für so etwas ist das 'glob'-Modul aus der Standardbibliothek da:

Code: Alles auswählen

In [10]: import glob

In [11]: glob.glob('*.py')
Out[11]: ['test.py', 'radioscan.py', 'BeautifulSoup.py']
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:Meine Güte warum so umständlich...
Gute Frage, man sollte Microsoft fragen warum deren Shells so schlecht sind, das sie das nicht selbst können.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Oder die Anwender warum sie sich keine ordentliche Shell zulegen wie Du. :-)
Antworten