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

JOOOOOO :shock: wie das abgeht!!!^^
ICH DANKE EUCH ALLEN VIELMALS!!!! :lol: :lol: :lol: :lol:
ihr seid die besten echt^^
das hat mir jetzt ca 1ne woche sucharbeit erspart!!^^ :lol: :lol:
ne ehrlich jetzt THX AN ALLE!!!! vorallem jens muss ich danken^^
aber trotzdem ALLEN EINEN GREATEN DANK!!!!
SvL_Striker
User
Beiträge: 16
Registriert: Dienstag 25. November 2008, 10:42

sry dass ich sconwieder ankomme aber es gibt da ein kleines problem...
es gibt bilder die den gleichen namen haben aber unter einem anderem pfad gespeichert sind... es sind aber unter gleichem namen trotzdem unterschiedliche bilder...
das heist das programm müsste nicht nur bis zum ersten fund suchen und kopieren, sondern jeden namen in jedem ordner suchen und jeden fund kopieren...

eine ahnung wie man das jetzige programm so umschreibt, dass es weitersucht und die datei dann aber nicht überschreibt sondern zB eine (2) anhängt...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


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

er kopiert wohl die erste datei und dann bringt er die fehlermeldung:

Datei: 1I01856_204G-2C01730_20K-I-1.jpg
Gefunden in: V:\2\C\68.31.5-05-110265\1I01856_204G-2C01730_20K-I-1.jpg
C:\gesuchte Bilder2\1I01856_204G-2C01730_20K-I-1.jpg
Kopiere nach: C:\gesuchte Bilder2\1I01856_204G-2C01730_20K-I-1.jpg

Traceback (most recent call last):
File "C:/Dokumente und Einstellungen/Wesp/Desktop/Search-Copy/sc", line 59, in <module>
shutil.copyfile(abs_path, dest)
NameError: name 'abs_path' is not defined
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Ich bin ja nun wahrlich kein Moralapostel und bin immer froh, wenn mir geholfen wird, aber versuch doch einfach mal so eine Fehlermeldung selbst zu beheben. Die sagt dir doch recht deutlich, was los ist. In Zeile 59 wird als Argument abs_path übergeben - das wurde aber in dem Namensbereich nicht definiert. Also: was erwartet shutil.copyfile() für Argumente? Offensichtlich Start- und Zielpfad. Dann musst du jetzt halt gucken, wo du den Startpfad herbekommst... Einfach mal ausprobieren. :-)

Außerdem würdest du bei einem Blick in den Quelltext sofort erkennen, dass er überhaupt nichts kopieren muss bei der Ausgabe. Die print-Anweisung steht nämlich vor dem entsprechenden Befehl.
SvL_Striker
User
Beiträge: 16
Registriert: Dienstag 25. November 2008, 10:42

sorry aber komm damit irgendwie nicht klar...
natürlich muss ich den startpfad angeben... nur weis ich nicht welcher der startpfad ist... habe jetzt versucht gehabt abs_path = filelist zu setzten aber da bringt er mir jetzt noch mehr fehlermeldungen.. glaube er will nicht, dass beide den gleichen pfad bekommen...

wäre echt wichtig dass das bald geht... sonst bekomm cih stress mitm chef... bitte bitte helft mir nochmal.... :( :(
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Ich kann das Skript nicht testen, aber vom schnellen drübergucken:

Ja, dann musst du dich halt fragen warum das so ist. filelist beinhaltet den Rückgabewert der Funktion find_file. Und wenn du da jetzt einmal in die Funktion guckst, dann siehst du, dass es sich dabei um eine Liste handelt. Also hast du jetzt versucht eine Liste an shutil.copyfile() zu übergeben, die ja aber scheinbar einen String erwartet (wenn ich das heute mittag richtig gesehen habe).

In der Liste sollten aber die Pfade drin stehen. Also brauchst du das jeweilige Element aus der Liste. Du iterierst in Zeile #48 über diese Liste. Und was ist jetzt wohl path aus selbiger Zeile?

Code: Alles auswählen

for path in filelist:
Bau dir doch einmal ein paar print-Anweisungen ein, um dir auszugeben was da so in den Variablen steht. Und ansonsten hilft auch das hier: docs.python.org (sind allerdings die 2.6er)
SvL_Striker
User
Beiträge: 16
Registriert: Dienstag 25. November 2008, 10:42

oh thx^^ so wies aussieht funktionert das alles jetzt sogar... ma schaun ob wirklich alles so läuft wie es sollte...

also ich hab jetzt eig nur aus dem abs_path ein path gemacht...
hab mir gedacht, dass obendrüber ja eig der pfad ausgegeben wird wo er die datei gefunden hat... also hab cih path genommen xD

ist das richtig? xD xD xD xD

mfg striker
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

SvL_Striker hat geschrieben: ist das richtig? xD xD xD xD
Ja...

Wobei ich die Lösung nicht optimal finde. Kommt die Datei mehr als hundert Mal vor kracht dir das zusammen. Mit enumerate müsste das einfacher gehen.
SvL_Striker
User
Beiträge: 16
Registriert: Dienstag 25. November 2008, 10:42

jo es funktioniert... nur glaube ich, dass noch ein kleiner fehler drinne ist...
wenn ich das jetzt aus dem quellqode richtig interpretiere...
und zwar...
er sucht einen namen... findet ihn... kopiert ihn...
wenn der name nochmal in der liste vorkommt... sucht er ihn... findet ihn... will ihn kopieren... gibts schon... macht eine zahl (0-100 in der reihenfolge) dran... kopiert die datei rein... jedoch müsste es doch eigendlich schonwieder die gleiche Datei sein oder?... die die er als erstes findet...
er sollte aber eigendlich alle ordner nach dem namen durchsuchen und wenn die datei 2 oder 3 mal in unterschiedlichen ordnern ist... findet er immer nur die 1. und kopiert nur diese...

könnte man nicht noch eine zeile einfügen, mit der er weis, dass er IMMER alle ordner durchsuchen soll und jedes mal kopiert und nicht nach dem ersten fund nur kopieren und die nächste suchen?

wäre das noch möglich oder ist das nicht zu realisieren?

tutu mir wirklich leid dass ich hier so nerve...
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Ich verstehe dich nicht: Du hast eine Datei 'a.jpg'. Diese Datei wird in zwei Ordnern gefunden. Was soll er jetzt machen? Die Datei nur einmal kopieren, also nur den ersten Fund von 'a.jpg'? Oder soll er beide 'a.jpg'-Dateien, die er gefunden hat, kopieren? Die erste als a.jpg und die zweite als a1.jpg?
Ich dachte letzteres

Ich rede jetzt über diesen Code. Nein, deine Interpretation der Abläufe ist nicht ganz korrekt.

Es ist noch früh am Morgen, aber ich glaube der Code macht so oder so nicht das, was er soll. Gesucht wird nach einer Datei in #42. Dort kriegst du _alle_ Treffer als Liste. Kommt a.jpg zwei Mal vor, sind da also zwei Einträge drin. In #48 wird über diese Treffer iteriert. So weit, so gut. Also, erster Treffer, wir gehen in #48 in die Schleife rein. Die Print-Ausgabe "Gefunden in:" ist so nicht ganz richtig, gefunden haben wir das schon länger (nämlich in der Funktion, die wir in #42 aufgerufen haben). #50 zerlegt den Dateinamen in Dateiendung und Rest. Und ab #51 ist das denke ich jetzt falsch. Denn jetzt wird für den _ersten_ Treffer hundert(+1) (0-99 und '') Mal etwas angehängt und jedes Mal kopiert. Das stimmt so nicht. Der erste Treffer des Dateinamens sollte ohne eine Änderung kopiert werden, an den zweiten Treffer des Dateinamens müssen wir logischerweise etwas anhängen.

Mein Versuch (bestimmt nicht perfekt: es ist nicht sichergestellt, dass die fotoliste wieder geschlossen wird). Ich habe einen anderen Ansatz gewählt um an weitere Treffer der selben Datei Anhänge zu basteln.
SvL_Striker
User
Beiträge: 16
Registriert: Dienstag 25. November 2008, 10:42

das sieht doch richtig bombe aus^^

genauso hab ich es eigendlich zum schluss auch gedacht^^

erst alle suchen... dann alle gefundenen kopieren...

hätte er erst gesucht -> gefunden -> kopiert -> weitergesucht -> etc
wäre es ebenfalls richtig aber so ist ja ma hammermäßig xD


THX!!
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Eigentlich ist das nur Jens' Skript in dem ich den "Dateianhangmechanismus" verändert, sowie die Printanweisungen an eine andere Stelle geschrieben habe. Vielleicht schaust du dir beide noch einmal an um die Unterschiede zu sehen (denn die eigentliche "Suchen, Treffer durchgehen, Treffer kopieren"-Reihenfolge wurde von mir nicht geändert).
SvL_Striker
User
Beiträge: 16
Registriert: Dienstag 25. November 2008, 10:42

okay werd ich machen thx an wirklich alle^^
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

hallo!

so gehts auch ganz einfach:

Code: Alles auswählen

# -*- coding: iso-8859-15 -*-

import os, shutil

SOURCE_ROOT = r"blubb"
DEST_DIR = r"bilder"
PICTURELIST_FILE = r"bilderliste.txt"

def search(picturelist):
  found = []
  for root, dirs, files in os.walk(SOURCE_ROOT):
    found += [os.path.join(root, item) for item in picturelist if item in files]
  return found

f = open(PICTURELIST_FILE, "r")
picturelist = f.read().strip().split("\n")
f.close()
for item in search(picturelist):
  destfile = os.path.join(DEST_DIR, os.path.basename(item))
  cnt = 1
  while True:
    if not os.path.exists(destfile):
      break
    elif os.path.exists(destfile + "-" + str(cnt)):
      cnt += 1
    else:
      destfile += "-" + str(cnt)
      break
  print "Copying '%s' to '%s'" % (item, destfile)
  shutil.copyfile(item, destfile)
die 'bilderliste.txt' muss so ein format haben:

Code: Alles auswählen

bild1.jpg
bild2.png
bild3.bmp
lg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Antworten