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

你有两个明显的问题。

第一个是您从循环内部返回,因此当您点击return语句时,您只会处理循环的一次迭代。这就是为什么看起来您获得了第一个迭代值,而实际上您从未达到其他迭代。

您可以通过将return语句突出到正确的级别来解决此问题。

第二个问题是您将结果从clean_title(). name您只在变量中存储了一个已清理的标题。每次通过循环,您都会用该迭代中的新标题覆盖先前计算的标题。即使您解决了return问题,当前版本也会返回您计算的最后一个标题。

您可以在列表或字典中累积结果。如果是列表,则使用 初始化name = []并添加新标题name.append(title_goes_here)。如果您想在字典中累积结果,请使用 初始化name = {}并添加新标题name[index_goes_here] = title_goes_here。请注意,在字典的情况下,您需要有一些逻辑键值(通常是整数或字符串),稍后您将使用它们来恢复该值。

最后,我必须补充一点,我发现您对复数对象和动作使用单数大小写 ( filename, title, clean_title) 会造成混淆。我会调用文件名列表filenames,依此类推。

于 2013-01-31T03:58:56.913 回答
1

你只看了第一个之后就回来titlefilename

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

我建议clean_title只取一个文件名,并循环遍历每个文件,如下所示:

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    

这将返回一个带有两个键list的对象,每个键。dicttitleep_info

于 2013-01-31T03:51:06.173 回答
1
  1. 您的缩进return name是错误的,将其拉出与name={}语句处于同一水平
  2. title不应该是一个字符串它应该是一个变量for loop

它目前处于 if 条件下,因此一旦条件为真,处理完条件返回中的语句后,将执行

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 回答