递增文件名值的 While 循环

While loop for incrementing file name value

我有一个功能可以根据扩展名在目录中组织文件。例如,它创建一个名为 txt 的文件夹并将所有文本文件移动到该文件夹​​中。当已经有一个txt文件夹,如果有一个文本文件,那么它会自动成功地将它移动到该文件夹​​中。问题是它不会移动与 txt 目录中的文件同名的文件。

这是目录,txt 文件夹中包含一个名为 Text.txt 的文件,该目录还包含一个名为 Text.txt 的文件,因此无法将其移动到文件夹中,我试过了使用 while 循环,但由于多个 for 循环和复杂性,我无法在正确的位置使用它。谢谢!

def all_extensions_category(folder_to_track):
    if check_files(folder_to_track) == True:
        for file in os.listdir(folder_to_track):
            if os.path.isdir(os.path.join(folder_to_track, file)) == False and os.listdir(folder_to_track).__len__() != 0:
                try:
                    file_mappings = collections.defaultdict()
                    for filename in os.listdir(folder_to_track):
                        if not os.path.isdir(os.path.join(folder_to_track, filename)):
                            file_type = filename.split('.')[-1]
                            file_mappings.setdefault(file_type, []).append(filename)
        
                    for folder_name, folder_items in file_mappings.items():
                        folder_path = os.path.join(folder_to_track, folder_name)
                        folder_exists = os.path.exists(folder_path)
    
                        if not folder_exists:
                            os.mkdir(folder_path)
        
                        for folder_item in folder_items:
                            source = os.path.join(folder_to_track, folder_item)
                            destination = os.path.join(folder_path, folder_item)
                            os.rename(source, destination)
                    
                    return print("Successfully organized files based on extension")
                            
                except Exception as e:
                    return print(f'{folder_to_track}: is either empty or not organizable')
    
    else:
        return print(f'{folder_to_track}: is either empty or not organizable')

如果您想创建数字递增的文件,例如Windows 在复制具有相同名称的文件时执行,将您的 os.rename() 替换为以下函数:

def moveIncrementing(source, destination):
    i = 0
    while True:
        try:
            return os.rename(source, f"{destination}_{i}" if i else destination)
        except OSError as ex:
            i+=1
            print(ex)

它将继续尝试移动文件,直到操作成功。只是一个警告,它会在文件扩展名后添加数字,因此文件不会被其扩展名正确识别。但这是我要留给你的练习。