Brauche Hilfe bei einem Such-und-Kopier Programm

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.
SvL_Striker
User
Beiträge: 16
Registriert: Dienstag 25. November 2008, 10:42

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
SvL_Striker
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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Fehler von mir, tausch mal:

Code: Alles auswählen

dir = find_file(filename)
durch:

Code: Alles auswählen

abs_path = find_file(filename)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
SvL_Striker
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?....
Benutzeravatar
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()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
SvL_Striker
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?
querdenker
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
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!?
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

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",
)
SvL_Striker
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...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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:

Code: Alles auswählen

...
for filename in f:
    print "Datei:", filename
...
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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
SvL_Striker
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---
---------------------------------------------------------

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"
soll ich hier evtl auch ein r davor setzten?

mich stört es irgendwie, dass er bei

Code: Alles auswählen

print abs_path
None ausgibt... könnte es daran liegen, dass er die dateien nicht findet?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Du solltest auch die Ausgabe in die find_file() funktion rein packen, vor dem if

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
SvL_Striker
User
Beiträge: 16
Registriert: Dienstag 25. November 2008, 10:42

ehm... wie welche ausgabe meinst du jetzt?
Benutzeravatar
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)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

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.
Benutzeravatar
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/

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
SvL_Striker
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:

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!!!^^
Benutzeravatar
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/

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten