Перебор файлов Excel и вывод в одну папку в Python - PullRequest
0 голосов
/ 24 января 2019

У меня есть структура папок и подпапок:

D:/src
├─ xyz.xlsx
├─ dist
│  ├─ xyz.xlsx
│  ├─ xxx.zip
│  └─ xxy.xlsx
├─ lib
│  ├─ xy.rar
│  └─ xyx.xlsx
├─ test
│  ├─ xyy.xlsx
│  ├─ x.xls
│  └─ xyz.xlsx

Я хочу извлечь все файлы Excel (xls или xlsx) из исходного каталога и подкаталогов, удалить дубликаты на основе имен файлов Excel и поместить всеуникальные файлы в каталоге D: / dst.Как я могу следующий результат в Python?Благодарю.Ожидаемый результат:

D:/dst
├─ xyz.xlsx
├─ xxy.xlsx
├─ xyx.xlsx
├─ xyy.xlsx
├─ x.xls

Вот что я пробовал:

import os

for root, dirs, files in os.walk(src, topdown=False):
    for file in files:
        if file.endswith('.xlsx') or file.endswith('.xls'):
            #print(os.path.join(root, file))
            try:
                df0 = pd.read_excel(os.path.join(root, file))
                #print(df0)
            except:
                continue
            df1 = pd.DataFrame(columns = [columns_selected])
            df1 = df1.append(df0, ignore_index = True)
            print(df1)
            df1.to_excel('test.xlsx', index = False)

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Я думаю, что это будет делать то, что вы хотите:

import os
import shutil


src = os.path.abspath(r'.\_src')
dst = os.path.abspath(r'.\_dst')
wanted = {'.xls', '.xlsx'}

copied = set()

for root, dirs, filenames in os.walk(src, topdown=False):
    for filename in filenames:
        ext = os.path.splitext(filename)[1]
        if ext in wanted and filename not in copied:
            src_filepath = os.path.join(root, filename)
            shutil.copy(src_filepath, dst)
            copied.add(filename)
0 голосов
/ 25 января 2019

Поскольку у вас уже есть glob.glob, вам не нужно также делать os.walk, и наоборот. Но поскольку glob совпадает только с одним шаблоном за раз, и нет никакого способа обозначить необязательный дополнительный «x» в расширении, вам потребуется либо цикл glob дважды - один раз для каждого расширения; или используйте glob.glob( 'D:\\src\\*.xls*'), который может соответствовать '*.xlsm' и т. д.

Для каждого сопоставленного файла используйте shutil.move:

for file in glob.glob('D:\\src\\*.xls*'):
    shutil.move(file, 'D:\\dst\\' + os.path.basename(file))

С помощью os.walk вы можете выполнять каждую проверку расширений с помощью fnmatch.fnmatch в том же цикле:

for root, dirs, files in os.walk('D:\\src'):
    for file in files:
        if fnmatch.fnmatch(file, '*.xls') or fnmatch.fnmatch(file, '*.xlsx'):
            shutil.move(f'{root}\\{file}', f'D:\\dst\\{file}')
            # shutil.move(root + '\\' + file, 'D:\\dst\\' + file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...