Python 2.7; variable im copy path

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
Benutzeravatar
OttoPython
User
Beiträge: 47
Registriert: Montag 23. April 2012, 14:14

Hallo liebes Forum,

ich habe ein sehr ärgerliches Problem.
Ich erarbeite mir ein Skrippt zum auslesen von ext. HDD wobei der gesammte inhalt auf einen Servr kopiert werden soll.

Im Pronzip funktioniert das ganze auch. Aber ich lese mir aus einer bestimmten Datei auf der HDD den Filenamen aus und benötige davon die ersten 6 Ziffern um damit mehrere Zeilordner auf dem Server zu erzeugen.
Das Funktioniert auch ..

ich kann aber nicht in diese Verzeichnisse wechseln, da dieses Verzeichnis als Variable vorliegt und das System mit meiner Eingabe nicht umgehen kann. Jedoch gibt es keinen Syntaxfehler.

der konkrete Fall: li ist dabei die variable für das Zielverzeichnis

for j in (pol):
li = pol[1][0:6]
print li
break

ich wechsle mit

os.chdir(server)
os.system("mkdir "+li+"")

auf den server..
per os.listdir sehe ich auch das das Folder "li" erzeugt wurde.

jedoch,will ich nun kopieren mit
os.system("copy D:\test "+li+"")


bekomme ich "Das System kann den angegebenen Pfad nicht finden",selbst wenn ich den kompletten Pfad mit \"+li+" eingebe:
os.system("copy D:\test S:\"+li+" ")

ich bin aber ohnehin im richtigen verzeichnis. und ich komme nicht um den Weg herum für das Zielfolder eine Variable zu benutzen, da dieses Skrippt für hunderte von HDD funktionieren muss.

ich hoffe ihr könnt mir helfen was ich in der Eingabe verkehrt mache

beste grüße
Otto
"Im Burnout steckt viel Arbeit drin" -Lysander
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

OttoPython hat geschrieben:

Code: Alles auswählen

os.chdir(server)
os.system("mkdir "+li+"")
Wenn du Shell-Programmierung willst, dann verwende die Shell.

Wenn du Python möchtest, dann verwende hier os.mkdir (oder os.makedirs).
OttoPython hat geschrieben:jedoch,will ich nun kopieren mit
os.system("copy D:\test "+li+"")

bekomme ich "Das System kann den angegebenen Pfad nicht finden",selbst wenn ich den kompletten Pfad mit \"+li+" eingebe:
os.system("copy D:\test S:\"+li+" ")
Verwende zum Zusammensetzen von Pfaden sinnvollerweise os.path.join. Bist du völlig sicher, dass auf deinem Laufwerk S der angegebene Pfad existiert? Genaues Studium der Daten und der Fehlermeldung kann einem da manchmal die Augen öffnen.

Zum Kopieren könntest du übrigens shutil.copytree verwenden.
BlackJack

@OttoPython: Setze doch Quelltext bitte in Python-Code-Tags, damit die Einrückung erhalten bleibt und der Quelltext farbig hervorgehoben wird.

Dein Problem hat nichts mit den Variablen zu tun, sondern das '\t' kein rückwärtsgerichteter Schrägstrich gefolgt von einem kleinen T ist, sondern *ein* Zeichen und zwar das Tabulatorzeichen:

Code: Alles auswählen

In [282]: print 'D:\test'
D:      est

In [283]: len('\t')
Out[283]: 1
Warum verwendest Du überhaupt Python wenn das Programm hauptsächlich aus `os.system()`-Aufrufen besteht? Zum Erzeugen von Verzeichnissen und Kopieren von Dateien gibt es Funktionen in der Standardbibliothek. Schau Dir mal das `os`-Modul genauer an, und dazu das `shutil`-Modul.

Pfade sollte man mit den Funktionen im `os.path`-Modul verarbeiten.

Von `os.chdir()` und `os.system()` sollte man die Finger lassen. Das Arbeitsverzeichnis des Prozesses ist ein global gültiger Wert. Den zu verändern skaliert nicht und bei Problemen kann es schnell passieren dass man auf ganz andere Verzeichnisse zugreift, als man eigentlich wollte. Zum Beispiel wenn man an einer Stelle das Arbeitsverzeichnis ändert, Quelltext an andere Stelle aber davon ausgeht, dass es sich nicht verändert (hat). Statt `os.system()` sollte man sich an das `subprocess`-Modul halten.

Namen wie `li` und `pol` sind schlecht. Namen sollten dem Leser die Bedeutung der Werte, die daran gebunden sind, vermitteln. Unter solchen Abkürzungen (?) kann sich niemand etwas vorstellen. Selbst der ursprüngliche Autor nach einer gewissen Zeit nicht mehr.

Zeichenketten mit ``+`` zusammen zu setzen ist eher BASIC als Python. Idiomatisches Python verwendet zumindest wenn vor und nach einerm Wert noch weitere Zeichenketten kommen eher Zeichenkettenformatierung mittels ``%``-Operator oder `format()`-Methode auf Zeichenketten.
Benutzeravatar
OttoPython
User
Beiträge: 47
Registriert: Montag 23. April 2012, 14:14

hallo liebe user,

danke für eure hilfe
ja die Pfade haben alle existiert
ich hab es jezt mit folgenden code hinbekommen:

ken2 ist dabei eine Eingabe per *_input = ()
li ist ein ausgelesenes String von der Festplatte welches ich als Beschriftung für den Zielordner verwende

Code: Alles auswählen

os.chdir("Datenuebersicht")
# kopieren auf den Server
ziel = path+"\\Datenuebersicht\*"+ken2+" "+li
print ziel
os.system("copy "+ziel+" ")
beste grüße
Otto
"Im Burnout steckt viel Arbeit drin" -Lysander
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Als gelöst wirde ich die Aufgabe mit deinem Programm nicht bezeichnen ;-) Es macht zwar im Moment was du möchtest, aber das ganze Konstrukt steht auf sehr wackeligen Füßen. Du solltest daher unbedingt die Hinweise von /me und BlackJack umsetzen.

Sebastian
Das Leben ist wie ein Tennisball.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Das sieht reichlich selsam aus.

Wie bereits im Thread erwähnt: verwende zum zusammensezen von Pfaden os.path.join.
Warum verwendest fürst du den Copy-Befehl mit System aus? Das kann Python mit eigenen Mitteln.

Und zuletzt: das hier kann eine Batch-Datei auch. Warum der Overhead eines Python-Interpreters?
Nuby
User
Beiträge: 8
Registriert: Donnerstag 19. Juli 2012, 15:13

sparrow hat geschrieben:Das sieht reichlich selsam aus.

Wie bereits im Thread erwähnt: verwende zum zusammensezen von Pfaden os.path.join.
Warum verwendest fürst du den Copy-Befehl mit System aus? Das kann Python mit eigenen Mitteln.

Und zuletzt: das hier kann eine Batch-Datei auch. Warum der Overhead eines Python-Interpreters?
Ich würde auch eine Batch Datei erstellen. Viel zu einfach um das mit Python lösen zu müssen.
Antworten