Игнорировать папки с определенными типами файлов - PullRequest
1 голос
/ 01 января 2011

Я тщетно пытаюсь переписать мой старый скрипт Powershell, найденный здесь - "$ _. Extension -eq" не работает должным образом? - для Python. У меня нет опыта или знаний Python, и я «скрипт» - беспорядок, но в основном он работает. Единственное, чего не хватает, так это того, что я хотел бы иметь возможность игнорировать папки, которые не содержат «mp3s», или какой бы тип файла я не указывал. Вот то, что я до сих пор -

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)

Все, что я хотел бы сделать (если это возможно), это то, что когда скрипт просматривает папки, он игнорирует те, которые НЕ содержат «mp3s», и удаляет «pls.m3u». Я мог только заставить скрипт работать должным образом, если бы я создал 'pls.m3u' по умолчанию. Проблема в том, что это создает много пустых файлов 'pls.m3u' в папках, которые содержат, например, только файлы '.jpg'. Вы поняли.

Я уверен, что этот скрипт является кощунственным для пользователей Python, но любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 01 января 2011

Если я правильно понимаю, ваша основная проблема в том, что этот скрипт создает много пустых файлов pls.m3u.Это потому, что вы звоните open еще до того, как проверили, хотите ли вы что-нибудь написать.

Простым решением было бы изменить это:

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")

на это:

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")

То есть, открывайте файл только в первый раз, когда мы решим, что нам нужно записать его.

Более Pythonic может сделать что-то вроде этого:

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")

То есть сначала создайте список mp3-файлов в памяти (используя здесь понимание списка, хотя вы могли бы использовать простой старый цикл for и append, если вам это более удобно) изатем откройте файл, только если результирующий список не пуст.(списки достоверны, если не пустые)

0 голосов
/ 01 января 2011

Я думаю, что вы можете сделать это в двухуровневом подходе. Сначала скопируйте каталог верхнего уровня в другой каталог, игнорируя каталоги, которые не содержат ваши файлы mp3s.

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

А затем продолжайте подход, который вы применяете для файлов в вашем примере кода. Обратите внимание, что shutil.copytree имеет ignore_patterns только из python2.5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...