0

だから私は役に立たない、不要な文字のファイル名をきれいにする python スクリプトを書いていますが、問題が発生しています。すべての項目を含むリストまたは辞書を返す方法がわかりませんそれを繰り返しました。繰り返し処理した最初のアイテムのみを返します。Pythonで書くのはこれが初めてです。どんな助けでも大歓迎です。私は主に学ぶためにこれを書いています。clean_title() メソッドは、私が戻ろうとしているものです。そして私はそれを一番下で呼んでいます。

import os
import re

# here is how all my video files will look after this
# show name Season 1 Episode 1

filename = os.listdir("E:/Videos/TV/tv-show")



def clean_title(filename):
    name = {}
    for title in filename:
        n_title = title.split('.')
        index = [i for i, item in enumerate(n_title) if re.search('\w\d{2}\w\d{2}', item)]
        if len(index) > 0:
            name = {'title':n_title[0:index[0]], 'ep_info':n_title[index[0]]}
            return name


def get_show_name(filename):
    pass


def update_title():
    #show_title = get_show_name + ' ' + get_episode_info
    #print show_title


if __name__=="__main__":
    test = clean_title(filename)
    print test
4

4 に答える 4

2

2 つの異なる問題があります。

return1 つ目は、ループ内から戻るため、ステートメントにヒットしたときにループの 1 回の反復しか処理していないことです。そのため、実際には他の反復に到達していないのに、最初の反復値を取得しているように見えます。

returnこれは、ステートメントを正しいレベルにアウトデントすることで修正できます。

2 番目の問題は、 から返される結果を蓄積する方法にありますclean_title()。変数には、クリーンなタイトルを 1 つだけ格納していnameます。ループのたびに、以前に計算されたタイトルをその反復からの新しいタイトルで上書きしています。問題を修正したとしてもreturn、現在のバージョンは最後に計算したタイトルを返します。

リストまたは辞書のいずれかに結果を蓄積できます。リストの場合、 で初期化しname = []、 で新しいタイトルを追加しname.append(title_goes_here)ます。結果を辞書に蓄積したい場合は、 で初期化しname = {}、 で新しいタイトルを追加しname[index_goes_here] = title_goes_hereます。ディクショナリの場合、後で値を復元するために使用する論理キー値 (通常は整数または文字列) が必要であることに注意してください。

最後に、複数のオブジェクトとアクションに対して単数形 ( filenametitle、 ) を使用すると、混乱を招くと思うことを追加する必要があります。clean_titleファイル名のリストなどを呼び出しますfilenames

于 2013-01-31T03:58:56.913 に答える
1

あなたは最初だけ見た後に戻ってきていtitleますfilename

def clean_title(filename):
    # ...
    for title in filename:
        # ...
        if len(index) > 0:
            # ...
            return name

clean_titleファイル名を 1 つだけ取り、次のように各ファイルをループすることをお勧めします。

filenames = os.listdir("E:/Videos/TV/tv-show")
for filename in filenames:
    new_filename = clean_title(filename)
    # Rename file
于 2013-01-31T03:50:50.627 に答える
1

ループはリターンに達するとすぐに終了します。あなたがやりたいことは

def clean_title(filename):
    names = []
    for title in filename:
        n_title = title.split('.')
        index = [i for i, item in enumerate(n_title) if re.search('\w\d{2}\w\d{2}', item)]
        if len(index) > 0:
            names.append({'title':n_title[0:index[0]], 'ep_info':n_title[index[0]]})
    return names    

これは、2 つのキーを持つオブジェクトlistのとをそれぞれ返します。dicttitleep_info

于 2013-01-31T03:51:06.173 に答える
1
  1. のインデントが間違っています。ステートメントreturn nameと同じレベルになるように引き出しますname={}
  2. title文字列ではなく、for loop

現在 if 条件にあるため、条件が true になるとすぐに、条件内のステートメントを処理した後、return が実行されます。

def clean_title(filename):
    name_list = []
    for title in filename:
        n_title = title.split('.')
        index = [i for i, item in enumerate(n_title) if re.search('\w\d{2}\w\d{2}', item)]
        if len(index) > 0:
            # you should store the dictionary in the lists, as all the dictionaries will contain the common keys of `ep_info`
            name_list.append({title:n_title[0:index[0]], 'ep_info':n_title[index[0]]})
    return name_list # look here
于 2013-01-31T03:51:07.743 に答える