【问题标题】:Is there a way to place files into a folder based on matching strings in both?有没有办法根据两者中的匹配字符串将文件放入文件夹中?
【发布时间】:2020-05-09 05:20:42
【问题描述】:

我对 python 还很陌生,我将把它作为我的第二次体验来继续我的学习。我的第一个项目(使用 pandas 进行数据分析)会比这个更难,但这将是一个新的领域,我需要一些帮助才能开始,因为我什至不知道在任何文档中搜索什么。

我在一个目录中有许多以电视节目命名的文件夹。我在另一个目录中有很多文件,多个剧集,其中几个节目。一个问题是,当我下载每一集时,它都存储在同一个标​​题的文件夹中。到目前为止,我一直在手动组织文件,但它已经到了自动化的好地方(也是一个很好的学习练习)。有没有办法在“下载”文件夹中搜索包含包含字符串的文件的文件夹,比如“家园”,并将该文件(剧集)移动到另一个目录中标题为“家园”的文件夹中?我还需要为每个文件/文件夹匹配多个字符串,例如“Game”和“Thrones”。将它们移动到目录很容易,但获得匹配的字符串是我想要了解的地方。然后我的下一个目标是遍历“下载”中的每个文件并将其分类到正确的电视节目文件夹中。

folders = 'list of folders in downloads'
#maybe I need to create a list here or a function that creates a list?

source_dir = "C:\Users\Downloads"
destination_dir = "C:\Users\TV Shows"
for folder_names in folders:
   if folder_name contains destination_name:
   # destination_name will be undefined but this is what i want
   source_path = str(source_dir) + str(file_name) + str(.mp4)
   destination_path = str(destination_dir) + str(file_name) + 
   str(.mp4)
      shutil.move(source_path, destination_path)
   if not:
      do nothing

必须更改它,因为有些变量会产生错误并且语法不好,但这是我想要的一般想法。

【问题讨论】:

  • 你看过pathlib吗?您将与shutil 一起编写一个简单的脚本。 pathlib的综合使用见rednafi.github.io/digressions/python/2020/04/13/…
  • 您是否正在为此寻找特定于 python 的解决方案?如果没有,您可以使用 shell 中的命令执行此操作:stackoverflow.com/a/22388517/10266625
  • if "Game" in folder_name and "Thrones" in folder_name: 甚至if "game" in folder_name.lower() and "thrones" in folder_name.lower(): 更多单词可以使用for-loop 分别检查每个单词。
  • 顺便说一句:folders_and_files = os.listdir("downloads") 。或带有子文件夹for root, folders, files in os.walk("downloads"):
  • 好吧,我想用 python 来做一些练习。 Pathlib 可能会工作。我需要我的脚本在目录中搜索文件夹名称(我可以很容易地获得文件夹名称列表),然后在另一个目录中搜索所有文件名(可以获得列表),以及是否至少有两个字符串与任何文件匹配和任何文件夹,然后将该/那些文件移动到该文件夹​​中。问题在于有很多文件和很多文件夹,因此将它们一一列出并不理想。我需要一个“如果文件名中的两个字符串与文件夹名中的两个字符串匹配,则将文件移动到文件夹”命令。

标签: python for-loop if-statement path shutil


【解决方案1】:

如果您有很多文件和文件夹,请使用for-loops 来处理它们。

您必须将文件名拆分为单词 - split(' ') - 并使用 for-loop 分别检查文件夹名称中的每个单词,并计算文件夹名称中的单词。当计数为 2 或更多时,移动文件。

或多或少:

all_filenames = [
    'Game of Throne part II.mp4',
    'other file.mp4',
]

all_folders = [
    'Game Throne',
    'Other Files'
]

for filename in all_filenames:

    words = filename.lower().split(' ')
    moved = False

    for folder in all_folders:

        count = 0

        for word in words:
            if word in folder.lower():
                count += 1

        if count >= 2:
            print('count:', count, '|', filename, '->', folder)
            # TODO: move file
            moved = True
            break

    if not moved:
        print('not found folder for:', filename)
        # TODO: you could move file to `Other Files`

编辑: 版本,获取所有匹配的文件夹并要求用户选择正确的文件夹。

我没有测试它。可能需要更多代码来检查用户是否选择了正确的号码。并最终添加选项以跳过它而不移动文件。

all_filenames = [
    'Game of Throne part II.mp4',
    'other file.mp4',
]

all_folders = [
    'Game Throne',
    'Other Files'
]

for filename in all_filenames:

    words = filename.lower().split(' ')
    matching = []


    for folder in all_folders:

        count = 0

        for word in words:
            if word in folder.lower():
                count += 1

        if count >= 2:
            print('count:', count, '|', filename, '->', folder)
            matching.append(folder)

    #if not matching:
    if len(matching) == 0:
        print('not found folder for:', filename)
        # TODO: you could move file to `Other Files`
    elif len(matching) == 1:
        print('move:', filename, '->', matching[0])
        # TODO: move file to folder matching[0]
    else:
        for number, item in enumerate(matching):
            print(number, item)
        answer = int(input('choose number:'))
        print('move:', filename, '->', matching[answer])
        # TODO: move file to folder matching[answer]

【讨论】:

  • 谢谢!似乎这正是我想要的。有没有办法将多个分隔符传递给 .split()?是否还会有一个步骤提示它询问我,如果它找到两个满足 count>=2 的文件夹,我想将它移动到哪个文件夹?
  • 对于标准的split(),你不能使用更多的分隔符,但你可以使用模块re(正则表达式)。 IE。 re.split('[., ]', 'a,b.c d')['a', 'b', 'c', 'd']
  • 在当前代码中,当它找到第一个匹配单词的文件夹时,它使用break 退出循环。您必须这样做:在for-loop 之前,您必须为匹配的文件夹创建空列表,在if count >= 2:您必须将匹配的文件夹添加到列表中,在for-loop 之后您必须使用@ 987654334@ 检查您找到了多少个匹配的文件夹。如果你得到 2 个或更多,那么你可以打印然后使用 input() 供用户决定。
  • Furas,这是我的代码模板,非常感谢。有一个我想不出如何解决的问题:count +=1 正在添加每个匹配的单词,这很好,但它也添加了重复的单词。有没有办法让它忽略重复的单词?
  • 使用set() 只获取唯一的单词len( set(["word", "word"]) ) 给出1 所以你可以使用words = set(words)words = list( set(words) )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多