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
Brauche Hilfe bei einem Such-und-Kopier Programm
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
So sieht man sich wieder
ungetestet:
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)
-
- User
- Beiträge: 16
- Registriert: Dienstag 25. November 2008, 10:42
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?
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?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Fehler von mir, tausch mal:
durch:
Code: Alles auswählen
dir = find_file(filename)
Code: Alles auswählen
abs_path = find_file(filename)
-
- User
- Beiträge: 16
- Registriert: Dienstag 25. November 2008, 10:42
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?....
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?....
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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()
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()
-
- User
- Beiträge: 16
- Registriert: Dienstag 25. November 2008, 10:42
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?
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?
-
- User
- Beiträge: 424
- Registriert: Montag 28. Juli 2003, 16:19
- Wohnort: /dev/reality
schau dir mal fsl an : File Selection Language
könnte für dich und die Aufgabe genau das richtige sein
könnte für dich und die Aufgabe genau das richtige sein
@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!?
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",
)
-
- User
- Beiträge: 16
- Registriert: Dienstag 25. November 2008, 10:42
@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...
@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...
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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;SvL_Striker hat geschrieben:...
AUSGABE:
C:\Dokumente und Einstellungen\Wesp\Desktop
Datei: 1I01856_204G-2C01730_20K-I-1.jpg;
Datei nicht gefunden!
...
Also Semikolon aus Textdatei löschen, oder satt:
Code: Alles auswählen
...
for filename in f:
print "Datei:", filename
...
Code: Alles auswählen
...
for filename in f:
filename = filename.strip(" ;")
print "Datei:", filename
...
bzw. Code so einfügen: http://www.python-forum.de/faq.php#21
-
- User
- Beiträge: 16
- Registriert: Dienstag 25. November 2008, 10:42
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---
---------------------------------------------------------
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?
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)
Code: Alles auswählen
DEST_DIR = "C:\gesuchte Bilder"
mich stört es irgendwie, dass er bei
Code: Alles auswählen
print abs_path
-
- User
- Beiträge: 16
- Registriert: Dienstag 25. November 2008, 10:42
ehm... wie welche ausgabe meinst du jetzt?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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)
(Zuviel Sourcecode funktioniert hier im Forum nicht so besondern, scheiß phpBB)
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Kann man in strip entfernen, siehe: http://paste.pocoo.org/show/92517/
-
- User
- Beiträge: 16
- Registriert: Dienstag 25. November 2008, 10:42
so hab soweit alles befolgt und ich glaube ihr habt mir bald den arsch gerettet xD
neue ausgabe:
ich nehme einfach mal stark an, dassder 2te \ hier nicht hingehört oder?^^
EIN GROßES THX AN ALLE SCHON JETZT 1000MAL!!!^^
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'
EIN GROßES THX AN ALLE SCHON JETZT 1000MAL!!!^^
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Ne, nochmal ein Fehler meinerseits, siehe: http://paste.pocoo.org/compare/92520/92517/