Как мне перенести каждый файл расширения из одного каталога в другой? Я написал код, но получаю исключение

Этот фрагмент кода - моя первая попытка создать программу. Я получаю сообщение об ошибке при запуске, которое гласит:

PermissionError: [WinError 32] Процесс не может получить доступ к файлу, потому что он используется другим процессом: '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)}')

person Gabriel Almeida    schedule 14.09.2017    source источник
comment
если какой-либо из этих файлов открыт в каком-либо другом процессе, закройте их и повторите попытку.   -  person Antimony    schedule 14.09.2017
comment
excel_files = glob('*.xlsx') excel_files.append(''.join(glob('*.xls'))) Содержат ли файлы excel_files правильные файлы Excel, как ожидалось? Может быть, список будет пустым.   -  person aspo    schedule 14.09.2017
comment
Удалите это: excel_files.append (''. Join (glob ('*. Xls'))), и он отлично работает. Вы добавляете пустой раздел, чтобы ваш список выглядел как [''], который затем ваш цикл for пытается изменить '', чего он не может.   -  person Steve Byrne    schedule 14.09.2017
comment
Это правильно. Я подумал об этом и попытался поставить оператор If, чтобы проверить, пуст ли он, но не смог сделать это правильно. Я собираюсь прочитать документацию glob, чтобы узнать, могу ли я искать какие-либо расширения Excel, иначе я не знаю, как мне искать как xlsx, так и xls   -  person Gabriel Almeida    schedule 15.09.2017


Ответы (2)


Я попробовал вашу программу, но она не работает, как на моем компьютере. Я изменил несколько строк, и все работает. Надеюсь, это поможет

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
person Francois    schedule 14.09.2017
comment
Это выглядит интересно. Я ввел ввод, потому что я не собираюсь запускать его на своем компьютере, и мне понадобится правильный каталог на ее компьютере. Но, думаю, я просто возьму каталог ее компьютера. - person Gabriel Almeida; 15.09.2017

Я знаю, что 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')

и так далее

person Dylan Hicks    schedule 14.09.2017
comment
Вот такая красота. Я до сих пор не могу понять, как все это работает. Это то, что называется хорошим кодом, а мой - плохим кодом? Без проблем могу сказать, что это моя первая программа. - person Gabriel Almeida; 15.09.2017
comment
Ржу не могу! Я бы не назвал ваш код плохим или мой код хорошим. Просто разные решения одной и той же проблемы. - person Dylan Hicks; 15.09.2017