Verschieben mit shutil.move

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.
Antworten
anymagical
User
Beiträge: 33
Registriert: Montag 2. April 2012, 15:34

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

os.chdir("Downloads")
for file in os.listdir():
heisst besser (und funktioniert dann auch)

Code: Alles auswählen

for file in os.listdir("Downloads"):

Code: Alles auswählen

if file.find(".mp3") > 0:
heisst besser (es sei denn du willst z.b. `sammlung.mp3.txt' mit verschieben)

Code: Alles auswählen

if file.endswith(".mp3"):
Fuer den eigentlichen Fehler: Bitte gib den kompletten Traceback an, `shutil.move` hat naemlich nur dann ein Problem mit Verzeichnissen, wenn `src` eines ist.
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.
anymagical
User
Beiträge: 33
Registriert: Montag 2. April 2012, 15:34

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'
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Auch wenn `abspath' hier ueberfluessig ist: Fuehre mal

Code: Alles auswählen

shutil.move(os.path.abspath(filename), dest_dir)
aus. Ich wette du siehst dann das Problem.
anymagical
User
Beiträge: 33
Registriert: Montag 2. April 2012, 15:34

Da fällt mir nur eines ein:

:o

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
Antworten