*.* als sys.argv übergeben

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.
pycho78
User
Beiträge: 6
Registriert: Montag 5. Februar 2007, 20:20

*.* als sys.argv übergeben

Beitragvon pycho78 » Donnerstag 24. April 2008, 23:31

Hi,
ich versuche verzweifelt *.* als sys.argv element zu übergeben, das klappt aber nur wenn ich das in " " stecke, also so: "*.*" , das würde ich gerne vermeiden.

Ich will 3 Elemente übergeben (src, dst und eben z.B. *.*), dabei prüfe ich auch die Anzahl der übergebenen Elemente mit: if not len(sys.argv) == 4, denke da liegt das Problem weil *.* gesplittet wird und somit mehr Elemente entstehen??? Die anderen Elemente ohne Punkt klappen auch wunderbar, nur eben *.* nicht :( was mache ich falsch?

Gruß,
pycho
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Beitragvon veers » Donnerstag 24. April 2008, 23:47

Das *.* wird vermutlich von deiner Shell expandiert - sprich in Dateinamen ungewandelt ;)
My Website - 29a.ch
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
lunar

Beitragvon lunar » Freitag 25. April 2008, 09:44

Natürlich hätte man die Argumente auch einfach mal mit einem einfachen ``print sys.argv`` überprüfen können, dann wäre man eventuell von selbst auf die Ursache des Problems gekommen ;)
pycho78
User
Beiträge: 6
Registriert: Montag 5. Februar 2007, 20:20

Beitragvon pycho78 » Freitag 25. April 2008, 10:01

hehe, stimmt eigentlich, aber nicht mehr um die Uhrzeit zu der ich das gestern gepostet habe :)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 25. April 2008, 13:19

veers hat geschrieben:Das *.* wird vermutlich von deiner Shell expandiert - sprich in Dateinamen ungewandelt ;)

Hängt von der Shell ab. Unter Linux ist das so, unter Windows müssen die Programme selbst Wildcards expandieren.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
pycho78
User
Beiträge: 6
Registriert: Montag 5. Februar 2007, 20:20

Beitragvon pycho78 » Freitag 25. April 2008, 22:41

naja, ich muss das Programm am Ende auf linux und auch auf Windows ausführen können. Ziel ist es nur Dateien (keine Verzeichnisse) aus einem Pfad in eine "Log Struktur" in der Form Y2008/D25/h23/file.txt zu verschieben oder wahlweise kopieren. Mein Programm läuft wie ich will unter Windows (da hatte ich angefangen, unter Linux läuft das so leider nicht, da ich glob.glob(sys.argv[1]) benutzt habe und z.B. *.* übergeben hatte). Muss weitersuchen wie ich es am geschicktesten anstelle. Hat jemand einen Tipp wie ich auf beiden Betriebssystemen alle Files eines Verzeichnisses in ein Array schreiben kann? Aktuell versuche ich es so:

for root, dirs, files in os.walk('/pfad/'):
print files


Bin leider nicht wirklich fit in python bisher... aber das will ich ändern :)
Mein Code der unter win aktuell laeuft sieht so aus:




Code: Alles auswählen

import os
import glob
import time
import sys
import shutil
import os

# define a class for easier coding below ;)
class Timestamp:
        def __init__(self):
                self.filestamp=time.strftime('%Y%m%d%h%m')
                self.dirstamp=time.strftime('%Y%m%d%h%m')
                if os.name =='nt':
                        self.dirsplit='\\'
                elif os.name == 'posix':
                        self.dirsplit='/'
                        print 'Unix like system detected...using "/" for directories'

        def gettime(self):
                #definition of the timestamp used for files YyyyyMmmDddHhhmmm
                self.filestamp='Y'+time.strftime('%Y')+'M'+time.strftime('%m')+'D'\
                +time.strftime('%d')+'h'+time.strftime('%H')+'m'+time.strftime('%M') \
                +'s'+time.strftime('%S')+'_'
                return self.filestamp

        def getdirtime(self):
                #definition of the timestamp used for files YyyyyMmmDddHhhmmm
                self.dirstamp='Y'+time.strftime('%Y')+ self.dirsplit + 'M'+time.strftime('%m')+ self.dirsplit +'D' \
                +time.strftime('%d')
                return self.dirstamp

        def makedir(self):
                        #definition of foldernames with Yyy\Mmm\Ddd structure
                        self.dirstamp=self.dirsplit + 'Y'+ time.strftime('%Y')+ self.dirsplit + 'M'\
                        +time.strftime('%m')+ self.dirsplit + 'D' + time.strftime('%d')
                        return self.dirstamp

f=Timestamp()
logtimestamp=f.gettime()[:-1]
logdirstamp=f.getdirtime()


if len(sys.argv) == 3:
        if not os.path.exists(sys.argv[2] + logdirstamp):
                os.makedirs(sys.argv[2] + logdirstamp)

        try:
                for i in glob.glob(sys.argv[1]):
                     shutil.copy(i, sys.argv[2] + logdirstamp + f.dirsplit)
                     print 'copying ' + i + ' to: ' + logdirstamp + os.path.basename(i)
        except BaseException:
                raise


else:
        print 'usage:\tpython copyfilestohist.py "*.*" "d:\\"'
BlackJack

Beitragvon BlackJack » Freitag 25. April 2008, 23:54

@pycho78: Die Klasse macht das ganze eher komplizierter als einfacher, da würde *eine* Funktion genügen, die alle drei Ergebnisse liefert. Man sollte auch *eine* Zeit ermitteln und die dann dreimal formatieren, weil die Zeitstempel sonst in ungünstigen Fällen nicht zusammen passen könnten.

Die Attribute `filestamp` und `dirstamp` werden in der `__init__()` berechnet, dann aber nicht verwendet, sondern extrem kompliziert in den beiden `get*()`-Methoden neu berechnet. Das geht jeweils mit *einem* `strftime()`-Aufruf! Der Sinn das die Platzhalter mit einem % eingeleitet werden ist ja, dass man auch noch andere Zeichen in der Zeichenkette unterbringen kann. Für `gettime()` sähe der Aufruf z.B. so aus: ``time.strftime('Y%YM%mD%dh%Hm%Ms%S')``

Pfade kann man mit `os.path.join()` plattformunabhängig zusammen setzen lassen, dass muss man nicht selbst programmieren.

Den `makedirs()`-Aufruf würde ich ohne vorherigen Test machen. Wenn das Zielverzeichnis schon existiert, schadet der Aufruf nicht.

Als Ausnahmebehandlung die Ausnahme einfach nur mit ``raise`` erneut auszulösen kann man sich sparen.

Und in einer Schleife etwas anderes als ganze Zahlen an den Namen `i` zu binden, bringt Dir den Hass von jedem ein, der das Programm irgend wann einmal warten muss.
pycho78
User
Beiträge: 6
Registriert: Montag 5. Februar 2007, 20:20

Beitragvon pycho78 » Samstag 26. April 2008, 09:28

@BlackJack:

Danke für Deine Tipps. Das mit der Klasse war eher einfach mal ein Versuch eine Klasse zu benutzen (hatte ich noch nie gemacht). Ich neige wirklich dazu alles zu verkomplizieren :) liegt aber einfach daran das ich so gut wie keine Erfahrung im Programmieren habe, ich werde mir Deine Ratschläge zu Herzen nehmen und einfach noch einmal von vorne beginnen.

Danke und Gruß,
Pycho

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], DeaD_EyE