如何将扩展名的每个文件从一个目录获取到另一个目录?我写了一段代码,但出现异常

How do I get every file of an extension from a directory to another? I wrote a code but I'm getting an exception

这段代码是我第一次尝试创建程序。当 运行 显示为:

时,我收到错误消息

PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\Users\gabri\Desktop\' -> 'C:\Users\gabri\Desktop\Planilhas Excel\'

我做错了什么?该程序的目标是获取所有 excel,然后是 pdf,然后是 word 文件,并将它们放入程序创建的文件夹中。

import os
from glob import glob

# import cx_Freeze
print("Digite o diretório de origem.")
dirOrigem = input()

os.chdir(dirOrigem)

excel_files = glob('*.xlsx')
excel_files.append(''.join(glob('*.xls')))

dirDestinoXL = dirOrigem + '\' + 'Planilhas Excel'
if not os.path.exists(dirDestinoXL):
    os.makedirs(dirDestinoXL)

for i in excel_files:
    os.rename(f'{dirOrigem}\{"".join(i)}', f'{dirDestinoXL}\{"".join(i)}')

os.chdir(dirOrigem)

pdf_files = glob('*.pdf')

dirDestinoPDF = dirOrigem + '\' + 'PDF'
if not os.path.exists(dirDestinoPDF):
    os.makedirs(dirDestinoPDF)

for p in pdf_files:
    os.rename(f'{dirOrigem}\{"".join(p)}', f'{dirDestinoPDF}\{"".join(p)}')


os.chdir(dirOrigem)

word_files = glob('*.doc')
word_files.append(glob('*.docx'))

dirDestinoWord = dirOrigem + '\' + 'Word'
if not os.path.exists(dirDestinoWord):
    os.makedirs(dirDestinoWord)

for d in word_files:
    os.rename(f'{dirOrigem}\{"".join(d)}', f'{dirDestinoWord}\{"".join(d)}')

我知道 glob 有时会很乱。如果文件是打开的,您可能会遇到错误。这是我会做的:

import os

def move_files_with_extension(from_dir, to_dir, *extensions):
    if not os.path.isdir(from_dir):
        raise ValueError('{} is not a real directory'.format(from_dir))
    elif not os.path.isdir(to_dir):
        raise ValueError('{} is not a real directory'.format(to_dir))

    files_with_extensions = all_files_with_extensions_in(from_dir, *extensions)

    for file_path in files_with_extensions:
        os.rename(file_path, os.path.join(to_dir, os.path.basename(file_path)))

def all_files_with_extensions_in(dir, *extensions):
    files_with_extensions = list()

    for dir_path, dir_names, file_names in os.walk(dir):
        for file_name in file_names:
            if file_name.endswith(extensions):
                files_with_extensions.append(os.path.join(dir_path, file_name))

    return files_with_extensions

然后你可以做:

dirOrigem = input()

excel_location = os.path.join(dirOrigem, 'Planilhas Excel')

move_files_with_extension(dirOrigem, excel_location, '.xls', '.xlsx')

等等

我试过你的程序,但它不能像在我的电脑上那样工作。我改变了一些线路并且它有效。希望对你有帮助

import os
from glob import glob

dirOrigem = r'C:\Users\fchal\Desktop\temp' # here I changed the code just because I didn't want to bother using input()
os.chdir(dirOrigem)

excel_files = glob('*.xlsx')
excel_files.extend(glob('*.xls'))


dirDestinoXL = dirOrigem + '\' + 'xlsfile'
if not os.path.exists(dirDestinoXL):
    os.makedirs(dirDestinoXL)

for i in excel_files:
    os.rename(i, os.path.join(dirDestinoXL, i))


# same procedure for pdf and word files