2011-01-01 18 views
1

Ich versuche vergeblich, mein altes Powershell-Skript hier zu schreiben - "$_.extension -eq" not working as intended? - für Python.Ich habe keine Python-Erfahrung oder Kenntnisse und mein 'Skript' ist ein Durcheinander, aber es funktioniert meistens. Das einzige, was fehlt, ist, dass ich Ordner ignorieren möchte, die keine mp3s enthalten, oder den von mir angegebenen Dateityp. Hier ist, was ich bisher -Ordner mit bestimmten Dateitypen ignorieren

import os, os.path, fnmatch 

path = raw_input("Path : ") 

for filename in os.listdir(path): 
if os.path.isdir(filename): 
    os.chdir(filename) 
    j = os.path.abspath(os.getcwd()) 
    mp3s = fnmatch.filter(os.listdir(j), '*.mp3') 
    if mp3s: 
     target = open("pls.m3u", 'w') 
     for filename in mp3s: 
      target.write(filename) 
      target.write("\n") 
    os.chdir(path) 

All Ich mag wäre in der Lage sein, zu tun (wenn möglich), ist, dass, wenn das Skript ist durch die Ordner Looping, dass es diejenigen ignoriert, die enthalten ‚mp3s‘ dies nicht tun, und entfernt die 'pls.m3u'. Ich konnte das Skript nur dann richtig funktionieren lassen, wenn ich die 'pls.m3u' standardmäßig erstellt habe. Das Problem ist, dass dadurch viele leere 'pls.m3u' Dateien in Ordnern entstehen, die zB nur '.jpg' Dateien enthalten. Du hast die Idee.

Ich bin sicher, dass dieses Skript für Python-Benutzer blasphemisch ist, aber jede Hilfe würde sehr geschätzt werden.

Antwort

2

Wenn ich richtig verstehe, ist Ihr Kernproblem, dass dieses Skript viele leere pls.m3u Dateien erstellt. Das ist, weil Sie open aufrufen, bevor Sie sogar überprüft haben, ob Sie etwas haben, das Sie schreiben möchten.

Eine einfache Lösung wäre, dies zu ändern:

target = open("pls.m3u", 'w') 
j = os.path.abspath(os.getcwd()) 
for filename in os.listdir(j): 
    (title, extn) = os.path.splitext(filename) 
    if extn == ".mp3": 
     target.write(filename) 
     target.write("\n") 

in diese:

target = None 
j = os.path.abspath(os.getcwd()) 
for filename in os.listdir(j): 
    (title, extn) = os.path.splitext(filename) 
    if extn == ".mp3": 
     if not target: 
      target = open("pls.m3u", 'w') 
     target.write(filename) 
     target.write("\n") 
if target: 
    target.write("\n") 
    target.write("\n") 

Das heißt, nur die Datei öffnen Sie das erste Mal, dass wir entscheiden, wir es schreiben müssen.

Ein Pythonic Ansatz könnte, so etwas zu tun sein:

j = os.path.abspath(os.getcwd()) 
mp3s = [filename for filename in os.listdir(j) 
     if os.path.splitext(filename)[1] == ".mp3"] 
if mp3s: 
    target = open("pls.m3u", 'w') 
    for filename in mp3s: 
     target.write(filename) 
     target.write("\n") 
    target.write("\n") 
    target.write("\n") 

Das heißt, zunächst eine Liste des mp3s im Speicher erstellen (mit einer Liste Verständnis hier, wenn Sie einen einfachen alten verwenden könnten for Schleife und append, wenn Sie sich damit wohler fühlen) und öffnen Sie dann die Datei nur, wenn die resultierende Liste nicht leer ist. (Listen sind truthy wenn nicht leer)

+0

[fnmatch] (http://docs.python.org/library/fnmatch.html#module-fnmatch) ist wirklich nützlich: 'mp3s = fnmatch.filter (os.listdir (Ordner), '* .mp3') ' –

+0

@ THC4k Ich habe versucht, als" literal "eine Änderung wie möglich zu gehen, aber ich stimme zu, dass dies scheint ein guter Ort, um fnmatch statt os.path.splitext zu verwenden '. (Die Verwendung des Index ist besonders unbefriedigend.) –

+0

Nun habe ich meinen ursprünglichen Beitrag bearbeitet, um die Änderungen wiederzugeben, die ich vorgenommen habe. Ich habe Ihr erstes Beispiel nicht vollständig verstanden, aber ich konnte sehen, wie Ihr zweites Beispiel funktioniert, also habe ich es stattdessen verwendet. Leider habe ich immer wieder Syntaxfehler bezüglich der Zeile '== ".mp3"] bekommen, so dass ich stattdessen in den fnmatch-Vorschlag aufgenommen habe und es jetzt perfekt funktioniert. Vielen Dank für Ihre Hilfe, sehr geschätzt! – gavin19

0

Ich denke, dass Sie es in einem zweistufigen Ansatz tun können. Kopieren Sie zuerst das Toplevel-Verzeichnis in ein anderes Verzeichnis und ignorieren Sie dabei die Verzeichnisse, die Ihre mp3s-Dateien nicht enthalten.

import shutil 
IGNORE_PATTERNS = ('*mp3s') 
shutil.copytree(SOURCE_DIR, TARGET_DIR, ignore=shutil.ignore_patterns(IGNORE_PATTERNS)) 

Und dann weiter mit der Vorgehensweise, die Sie für Dateien in Ihrem Beispielcode tun. Beachten Sie, dass shuttil.copytree die ignore_patterns nur von python2.5 hat

Verwandte Themen