2011-01-01 10 views
1

ここで見つけた古いPowershellスクリプトを書き直すことを無駄にしています - "$_.extension -eq" not working as intended? - Python.IにはPythonの経験や知識がなく、私の 'script'は混乱していますが、欠落しているのは、 '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) 

私は(可能であれば)行うことができるようにしたいすべてのスクリプトは、それが「MP3ファイル」を含まないものを無視して、フォルダをループされている場合ということです、 'pls.m3u'を削除します。私はデフォルトで 'pls.m3u'を作成した場合、スクリプトが正しく動作するようにしかできませんでした。問題は、例えば '.jpg'ファイルのみを含むフォルダに空の 'pls.m3u'ファイルをたくさん作成することです。あなたはその考えを得る。

私はこのスクリプトがPythonユーザーにとっては冒涜的だと確信していますが、どんな助けでも大歓迎です。

答えて

2

私が正しく理解していれば、このスクリプトはたくさんの空の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") 

ファイルだけに、我々はそれに書き込みする必要があると判断した最初の時間を開いて、つまり

簡単な修正は、これを変更することです。あなたはfor昔ながらを使用することができますが、第1のメモリ内のMP3ファイルのリストを作成している

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

(ここではリストの内包表記を使用して:

AよりPython的なアプローチは、このような何かをするかもしれませんあなたがそれに慣れている場合はappend)、結果のリストが空でない場合にのみファイルを開きます。 (リストは空でない場合真実です)

+0

[fnmatch](http://docs.python.org/library/fnmatch.html#module-fnmatch)は本当に便利です: 'mp3s = fnmatch.filter(os.listdir (フォルダ)、 '* .mp3') ' –

+0

@ THC4k私は"リテラル "として可能な限り変更しようとしていましたが、これはos.path.splitextではなくfnmatchを使うのに適していると私は同意します'。 (下付き文字を使用することは特に不満です) –

+0

私は、私が行った変更を反映するために私の元の投稿を編集しました。私はあなたの最初の例を完全に理解していませんでしたが、私はあなたの2番目の例がどのように動作するかを見ることができました。残念ながら、私は、行 '== ".mp3"]'に関して構文エラーを受けていましたので、代わりにfnmatchの提案を実行しました。両方のおかげであなたの助けになりました。 – gavin19

0

私はあなたが2段階でアプローチできると思います。まず、最上位ディレクトリを別のディレクトリにコピーし、mp3sファイルを含まないディレクトリを無視します。

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

次に、サンプルコードのファイルに対して行っているアプローチに進みましょう。 shutil.copytreeにはpython2.5のignore_patternsしかありません。

関連する問題