Seite 1 von 1
Verschieben mit shutil.move
Verfasst: Mittwoch 25. April 2012, 19:18
von anymagical
Guten Abend,
da Ordnung bekanntlich das halbe Leben ist dachte ich mir das ich Python einen Ordner mit mp3's säubern lasse.
Code: Alles auswählen
import shutil
import os.path
os.chdir("Downloads")
for file in os.listdir():
dest_dir="/home/Musik/"
if file.find(".mp3") > 0:
src=(os.path.abspath(file))
shutil.move(src,dest_dir)
#shutil.move(file,dest_dir)
will aber nicht so recht funktionieren. Ich bekomme entweder einen "Permission denied" Error oder neuerdings:
IOError: [Errno 21] Is a directory: '/home/Musik/'
Ich würde gerne einen Tip erhalten wo genau der Wurm im Code ist, nicht gleich die ganze Lösung.
in Liebe
Anymagical
Re: Verschieben mit shutil.move
Verfasst: Mittwoch 25. April 2012, 19:37
von cofi
heisst besser (und funktioniert dann auch)
heisst besser (es sei denn du willst z.b. `sammlung.mp3.txt' mit verschieben)
Fuer den eigentlichen Fehler: Bitte gib den kompletten Traceback an, `shutil.move` hat naemlich nur dann ein Problem mit Verzeichnissen, wenn `src` eines ist.
Re: Verschieben mit shutil.move
Verfasst: Mittwoch 25. April 2012, 19:51
von BlackJack
@anymagical: Von `os.chdir()` solltest Du die Finger lassen. Das Arbeitsverzeichnis gilt global für den ganzen Prozess. Man ändert das also für das gesamte Programm. Bei Programmen die etwas grösser sind, gibt es damit schnell mal Probleme wenn andere Programmteile ganz andere Annahmen über das Arbeitsverzeichnis machen. Noch schlimmer wird es wenn andere Programmteile auch `os.chdir()` verwenden. Dann verliert man schnell den Überblick wo welcher Pfad gültig ist. Das skaliert überhaupt nicht. Besser ist es wenn man Pfade mit den Funktionen aus `os.path` entsprechend relativ zum Arbeitsverzeichnis oder absolut erstellt und damit arbeitet.
`file` ist der Name des eingebauten Typs `file`. Den sollte man nicht neu binden. Ausserdem handelt es sich nicht um Dateiobjekte sondern um Dateinamen beziehungsweise Pfade.
Um festzustellen ob eine Zeichenkette in einer anderen vorkommt verwendet man den ``in``-Operator. Das ist hier aber letztendlich die falsche Operation, denn Du willst ja gar nicht wissen ob '.mp3' *irgendwo* in dem Dateinamen vorkommt, sondern ob der Dateiname damit *endet*. Dafür gibt es die `endswith()`-Methode.
Noch einfacher würde es Dir aber das `glob`-Modul machen.
`abspath()` ist hier im Grunde genau so überflüssig wie die Klammern um den Ausruck.
Die Ausnahme kann ich mir nicht erklären.
Re: Verschieben mit shutil.move
Verfasst: Mittwoch 25. April 2012, 19:54
von anymagical
Vielen Dank erstmals für die Tips.
So sieht das ganze denn nur unter berücksichtigung der Tips aus, wahrlich angenehmer!
Code: Alles auswählen
import shutil
import os
for fileid in os.listdir("Downloads"):
dest_dir="/home/Musik/"
if fileid.endswith(".mp3"):
shutil.move(fileid,dest_dir)
Der Fehler dazu:
Code: Alles auswählen
Traceback (most recent call last):
File "/usr/lib/python3.2/shutil.py", line 324, in move
os.rename(src, real_dst)
OSError: [Errno 2] No such file or directory
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "mover.py", line 8, in <module>
shutil.move(fileid,dest_dir)
File "/usr/lib/python3.2/shutil.py", line 332, in move
copy2(src, real_dst)
File "/usr/lib/python3.2/shutil.py", line 144, in copy2
copyfile(src, dst)
File "/usr/lib/python3.2/shutil.py", line 98, in copyfile
with open(src, 'rb') as fsrc:
IOError: [Errno 2] No such file or directory: 'Ran-D - Fanatics.mp3'
Re: Verschieben mit shutil.move
Verfasst: Mittwoch 25. April 2012, 20:47
von cofi
Auch wenn `abspath' hier ueberfluessig ist: Fuehre mal
aus. Ich wette du siehst dann das Problem.
Re: Verschieben mit shutil.move
Verfasst: Donnerstag 26. April 2012, 15:19
von anymagical
Da fällt mir nur eines ein:
Der Fehler war ein fehlendes Verzeichnis zwischen home und Downloads, tztztz
Dann sag ich mal recht herzlich Dankeschön an alle Poster!
Grüße
Anymagical