Seite 1 von 2
Brauche Hilfe bei einem Such-und-Kopier Programm
Verfasst: Dienstag 25. November 2008, 11:00
von SvL_Striker
Guten Tag an Alle
Ich bin Azubi Fachinformatiker im ersten Lehrjahr und habe ein folgendes Problem.
Ich soll in einem Verzeichnis in dem 16 Ordner sind insgesamt 451 Bilddateien finden und in ein bestimmten Verzeichnis kopieren.
Mir wurde empfohlen dafür eine Batch-Datei zu schreiben.
Habe jetzt 2,5 Stunden gesucht und trotzdem nicht hilfreiches gefunden.
Die Dateien sind in einer txt-Datei aufgelistet.
Ich habe mir auchscon einen Ablaufplan für das Programm überlegt.
Dieses lautet wiefolgt:
-erste Zeile der txt-Datei als zeichenabfolge in variable speichern
--im ausgangsverzeichnis in den ersten ordner navigieren
---vergleich von der variable mit den vorhandenen Dateien
----gefunden: -> datei kopieren in ein festgelegtes Verzeichnis
nicht gefunden: -> aus dem Ordner raus und in den 2. Ordner
------------------------------(dies solange bis entweder die Datei gefunden
wurde oder alle 16 Ordner durchsucht worden sind)--------------------------
-zweite Zeile der txt-Datei als zeichenabfolge in variable speichern
------------------------(gleichen ablauf von suchen + kopieren)---------------
-solange die nächste zeile der txt-Datei in der variable speichern, bis die zeile keine zeichenfolge mehr enthält
(leere Zeile / ende der gesuchten Dateien)
Es wäre wirklich super, wenn man mir einige Tipps geben könnte, ob und wie soetwas zu realisieren ist.
MfG
SvL_Striker
Verfasst: Dienstag 25. November 2008, 11:12
von jens
So sieht man sich wieder
ungetestet:
Code: Alles auswählen
# -*- coding: utf-8 -*-
import os, shutil
SOURCE_DIRS = (
"Verzeichnis1",
"Verzeichnis2",
"Verzeichnis3",
)
DEST_DIR = "AusgangsVerz"
TXT_FILENAME = "Bilderliste.txt"
def find_file(filename):
for dir in SOURCE_DIRS:
abs_path = os.path.join(dir, filename)
if os.path.isfile(abs_path):
return abs_path
f = file(TXT_FILENAME, "r")
for filename in f:
print "Datei:", filename
dir = find_file(filename)
if abs_path:
print "Gefunden in:", abs_path
else:
print "Datei nicht gefunden!"
continue
print "kopiere..."
shutil.copyfile(abs_path, DEST_DIR)
Verfasst: Dienstag 25. November 2008, 11:32
von SvL_Striker
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Wesp\Desktop\suchkopiermaschine2", line 39, in <module>
if abs_path:
NameError: name 'abs_path' is not defined
heist das soviel wie ich muss dem sagen dass es 'abs_path' gibt, oder muss ich ihm sagen was es ist?
Verfasst: Dienstag 25. November 2008, 11:35
von jens
Fehler von mir, tausch mal:
durch:
Verfasst: Dienstag 25. November 2008, 13:07
von SvL_Striker
hmm er läuft jetzt zwar durch, such auch nach jeder einzelnen bilddatei, die in der liste steht, findet aber keine einzige davon...
Datei: 1I01856_204G-2C01730_20K-I-1.jpg;
Datei nicht gefunden!
Datei: 1I01856_204G-2C01730_20K-I-2.jpg;
Datei nicht gefunden!
... etc
kann es sein, dass er nur imersten der ordner nachsucht?
oder, dass ich evtl den pfad falsch eingegeben habe?....
Verfasst: Dienstag 25. November 2008, 13:12
von jens
Kann schon sein. Kannst ja mal abs_path in find_file() ausgeben lassen.
Es kommt bei SOURCE_DIRS auch darauf an, ob du einen relativen Pfad angegeben hast oder ein absoluten. Wenn er relativ ist, dann ist es relativ zum aktuellen Verzeichnis und das wird wohl das Verzeichnis sein, wo du das Skript startes... Kann man sich aufgeben lassen mit print os.getcwd()
Verfasst: Dienstag 25. November 2008, 13:29
von SvL_Striker
habe für dafür das eingegeben:
SOURCE_DIRS = (
"V:\2\C\68.31.5-05-105480",
"V:\2\C\68.31.5-05-106337",
"V:\2\C\68.31.5-05-106643",
"V:\2\C\68.31.5-05-107359",
"V:\2\C\68.31.5-05-110265",
"V:\2\C\68.31.5-07-152387",
"V:\2\C\68.31.5-07-153385",
"V:\2\C\68.31.5-07-155980",
"V:\2\C\68.31.5-07-157874",
"V:\2\C\68.31.5-07-160836",
"V:\2\C\68.31.5-08-167004",
"V:\2\C\68.31.5-08-167720",
"V:\2\C\68.31.5-08-171877",
"V:\2\C\68.31.5-08-172335",
"V:\2\C\68.31.5-08-177228",
"V:\2\C\68.31.5-08-183977",
)
ist halt der pfad von den ordnern...
und die funktion print os.getcwd() gibt mir den pfad zum dekstop aus wo das programm ist...
muss ich evtl die datei in den pfad "V:\2\C\" ausführen (bzw dahin kopieren und dort ausführen?
Verfasst: Dienstag 25. November 2008, 13:42
von querdenker
schau dir mal fsl an :
File Selection Language
könnte für dich und die Aufgabe genau das richtige sein
Verfasst: Dienstag 25. November 2008, 13:49
von BlackJack
@SvL_Striker: Schau Dir Deine Ausgabe doch noch einmal genau an: Da ist ein Semikolon und eine Leerzeile nach jedem Dateinamen. Die stehen wohl so in der Textdatei mit den Dateinamen, gehören aber bestimmt nicht zum Dateinamen nach dem Du suchen möchtest, oder!?
Verfasst: Dienstag 25. November 2008, 13:57
von tordmor
Außerdem sind die SOURCE_DIRS nicht als rawstrings definiert und damit wird \ als Escape-character interpretiert.
Code: Alles auswählen
SOURCE_DIRS = (
r"V:\2\C\68.31.5-05-105480",
r"V:\2\C\68.31.5-05-106337",
r"V:\2\C\68.31.5-05-106643",
r"V:\2\C\68.31.5-05-107359",
r"V:\2\C\68.31.5-05-110265",
r"V:\2\C\68.31.5-07-152387",
r"V:\2\C\68.31.5-07-153385",
r"V:\2\C\68.31.5-07-155980",
r"V:\2\C\68.31.5-07-157874",
r"V:\2\C\68.31.5-07-160836",
r"V:\2\C\68.31.5-08-167004",
r"V:\2\C\68.31.5-08-167720",
r"V:\2\C\68.31.5-08-171877",
r"V:\2\C\68.31.5-08-172335",
r"V:\2\C\68.31.5-08-177228",
r"V:\2\C\68.31.5-08-183977",
)
Verfasst: Dienstag 25. November 2008, 14:03
von SvL_Striker
@tordmor habe es umgeändert... leider belibt das ergebnis genauso ungeändert xD...
@BlackJack ja ist mir nach meinem post auch aufgefallen xD
hab jetzt alle 451x das "V:\2\C\" rausgelöscht (in der fotoliste.txt)...
jetzt stimmen zumindest bei der ausgabe die datei-namen...
findet sie aber trotzdem nicht...
print os.getcwd() gibt den pfad zum skript aus... ist das richtig?
bei "print abs_path" gibt er "None" aus...
heist das hier könnte mein fehler sein weil er dann den zu durchsuchenden pfad nicht findet? bzw keinen angegeben hat?
jetzt schonmal ein großes THX an alle... und sry dass ich so nerve...
ich poste am besten nochmal das ganze programm rein... vllt ist das aufschlussreicher als meine beschreibungen xD
CODE:
# -*- coding: utf-8 -*-
import os, shutil
SOURCE_DIRS = (
r"V:\2\C\68.31.5-05-105480",
r"V:\2\C\68.31.5-05-106337",
r"V:\2\C\68.31.5-05-106643",
r"V:\2\C\68.31.5-05-107359",
r"V:\2\C\68.31.5-05-110265",
r"V:\2\C\68.31.5-07-152387",
r"V:\2\C\68.31.5-07-153385",
r"V:\2\C\68.31.5-07-155980",
r"V:\2\C\68.31.5-07-157874",
r"V:\2\C\68.31.5-07-160836",
r"V:\2\C\68.31.5-08-167004",
r"V:\2\C\68.31.5-08-167720",
r"V:\2\C\68.31.5-08-171877",
r"V:\2\C\68.31.5-08-172335",
r"V:\2\C\68.31.5-08-177228",
r"V:\2\C\68.31.5-08-183977",
)
DEST_DIR = "C:\gesuchte Bilder"
TXT_FILENAME = "Fotoliste2.txt"
print os.getcwd()
def find_file(abs_path):
for dir in SOURCE_DIRS:
abs_path = os.path.join(dir, filename)
if os.path.isfile(abs_path):
return abs_path
f = file(TXT_FILENAME, "r")
for filename in f:
print "Datei:", filename
abs_path = find_file(filename)
if abs_path:
print "Gefunden in:", abs_path
else:
print "Datei nicht gefunden!"
print abs_path
continue
print "kopiere..."
shutil.copyfile(abs_path, DEST_DIR)
AUSGABE:
C:\Dokumente und Einstellungen\Wesp\Desktop
Datei: 1I01856_204G-2C01730_20K-I-1.jpg;
Datei nicht gefunden!
None
Datei: 1I01856_204G-2C01730_20K-I-2.jpg;
Datei nicht gefunden!
None
...............etc...................
hoffe das ist ein wenig einleuchtender...
Verfasst: Dienstag 25. November 2008, 14:39
von jens
SvL_Striker hat geschrieben:...
AUSGABE:
C:\Dokumente und Einstellungen\Wesp\Desktop
Datei: 1I01856_204G-2C01730_20K-I-1.jpg;
Datei nicht gefunden!
...
BlackJack hat recht. In der Fotoliste2.txt Datei werden offensichtlich alle Dateinamen mit einem ";" abgeschlossen. Python sucht also nach
1I01856_204G-2C01730_20K-I-1.jpg;
Also Semikolon aus Textdatei löschen, oder satt:
das nehmen:
Code: Alles auswählen
...
for filename in f:
filename = filename.strip(" ;")
print "Datei:", filename
...
(Löscht hinten und vorn Leerzeichen und Semikolon)
bzw. Code so einfügen:
http://www.python-forum.de/faq.php#21
Verfasst: Dienstag 25. November 2008, 14:57
von SvL_Striker
so hab das mit dem semikolon aus der txt-datei gelöscht und zur sicherheit die zeile von jens auchnoch eingefügt...
neue ausgabe ist:
---------------------------------------------------------
C:\Dokumente und Einstellungen\Wesp\Desktop
Datei: 1I01856_204G-2C01730_20K-I-1.jpg
Datei nicht gefunden!
None
Datei: 1I01856_204G-2C01730_20K-I-2.jpg
Datei nicht gefunden!
None
---etc---
---------------------------------------------------------
Code: Alles auswählen
# -*- coding: utf-8 -*-
import os, shutil
SOURCE_DIRS = (
r"V:\2\C\68.31.5-05-105480",
r"V:\2\C\68.31.5-05-106337",
r"V:\2\C\68.31.5-05-106643",
r"V:\2\C\68.31.5-05-107359",
r"V:\2\C\68.31.5-05-110265",
r"V:\2\C\68.31.5-07-152387",
r"V:\2\C\68.31.5-07-153385",
r"V:\2\C\68.31.5-07-155980",
r"V:\2\C\68.31.5-07-157874",
r"V:\2\C\68.31.5-07-160836",
r"V:\2\C\68.31.5-08-167004",
r"V:\2\C\68.31.5-08-167720",
r"V:\2\C\68.31.5-08-171877",
r"V:\2\C\68.31.5-08-172335",
r"V:\2\C\68.31.5-08-177228",
r"V:\2\C\68.31.5-08-183977",
)
DEST_DIR = "C:\gesuchte Bilder"
TXT_FILENAME = "Fotoliste2.txt"
print os.getcwd()
def find_file(abs_path):
for dir in SOURCE_DIRS:
abs_path = os.path.join(dir, filename)
if os.path.isfile(abs_path):
return abs_path
f = file(TXT_FILENAME, "r")
for filename in f:
filename = filename.strip(" ;")
print "Datei:", filename
abs_path = find_file(filename)
if abs_path:
print "Gefunden in:"
else:
print "Datei nicht gefunden!"
print abs_path
continue
print "kopiere..."
shutil.copyfile(abs_path, DEST_DIR)
soll ich hier evtl auch ein r davor setzten?
mich stört es irgendwie, dass er bei
None ausgibt... könnte es daran liegen, dass er die dateien nicht findet?
Verfasst: Dienstag 25. November 2008, 14:59
von jens
Du solltest auch die Ausgabe in die find_file() funktion rein packen, vor dem if
Verfasst: Dienstag 25. November 2008, 15:00
von SvL_Striker
ehm... wie welche ausgabe meinst du jetzt?
Verfasst: Dienstag 25. November 2008, 15:02
von jens
Die Ausgabe von abs_path... So wie hier:
http://paste.pocoo.org/show/92515/
(Zuviel Sourcecode funktioniert hier im Forum nicht so besondern, scheiß phpBB)
Verfasst: Dienstag 25. November 2008, 15:07
von tordmor
Iteration über ein File behält das \n am Ende des Files:
>>> f = open('test.txt', 'r')
>>> for l in f:
... print repr(l)
...
'bla\n'
'fasel\n'
'schnack\n'
'\n'
>>>
Das stört dann im Dateinamen.
Verfasst: Dienstag 25. November 2008, 15:09
von jens
Kann man in strip entfernen, siehe:
http://paste.pocoo.org/show/92517/
Verfasst: Dienstag 25. November 2008, 15:14
von SvL_Striker
so hab soweit alles befolgt und ich glaube ihr habt mir bald den arsch gerettet xD
neue ausgabe:
Code: Alles auswählen
C:\Dokumente und Einstellungen\Wesp\Desktop
Datei: 1I01856_204G-2C01730_20K-I-1.jpg
V:\2\C\68.31.5-05-105480\1I01856_204G-2C01730_20K-I-1.jpg
V:\2\C\68.31.5-05-106337\1I01856_204G-2C01730_20K-I-1.jpg
V:\2\C\68.31.5-05-106643\1I01856_204G-2C01730_20K-I-1.jpg
V:\2\C\68.31.5-05-107359\1I01856_204G-2C01730_20K-I-1.jpg
V:\2\C\68.31.5-05-110265\1I01856_204G-2C01730_20K-I-1.jpg
Gefunden in: V:\2\C\68.31.5-05-110265\1I01856_204G-2C01730_20K-I-1.jpg
kopiere...
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Wesp\Desktop\suchkopiermaschine3", line 50, in <module>
shutil.copyfile(abs_path, DEST_DIR)
File "C:\Python26\lib\shutil.py", line 53, in copyfile
fdst = open(dst, 'wb')
IOError: [Errno 13] Permission denied: 'C:\\gesuchte Bilder'
ich nehme einfach mal stark an, dassder 2te \ hier nicht hingehört oder?^^
EIN GROßES THX AN ALLE SCHON JETZT 1000MAL!!!^^
Verfasst: Dienstag 25. November 2008, 15:17
von jens
Ne, nochmal ein Fehler meinerseits, siehe:
http://paste.pocoo.org/compare/92520/92517/