Как объединить похожие именованные файлы из нескольких папок в одну папку для каждого имени файла - PullRequest
0 голосов
/ 03 мая 2018

У меня 400 папок. В каждой папке есть 3 дополнительные папки, в которые мне нужно перейти, а затем в последней папке у меня 22 разных файла. Каждая из этих 400 папок имеет одинаковые имена файлов. В конечном итоге я хочу создать 22 папки, по одной для каждого имени файла, и в каждой из 22 папок мне нужны только файлы с одинаковыми именами. Поскольку в папке не может быть двух файлов с одинаковым именем, добавление последних 6 символов пути к имени файла решает проблему.

Используя изображение ниже в качестве примера файлов:

I need an ACO folder with 400 files all of which are labeled i.e., "ACO050168", "ACO150074", "ACO150128"
I need an BDUAL folder with 400 files all of which are labeled BDUAL i.e., "BDUAL050168", "BDUAL150074", "BDUAL150128"
etc..

Вот, например, пути к файлам, обратите внимание, что последняя и четвертая папки из последней папки уникальны

 'C:\\Users\\MBobak\\Documents\\Loop\\Raw Claims Data 050168\\D#CJR\\Y2018M02\\P050168',
 'C:\\Users\\MBobak\\Documents\\Loop\\Raw Claims Data 150074\\D#CJR\\Y2018M02\\P150074',
 'C:\\Users\\MBobak\\Documents\\Loop\\Raw Claims Data 150128\\D#CJR\\Y2018M02\\P150128'

22 файла в каждой папке структурированы как .csv, но не имеют расширения .csv. Они просто files. Я приложил изображение, чтобы показать, как оно выглядит. enter image description here

Я знаю, что есть способы сделать это в командной строке, но я не могу найти конкретный пример этого вопроса, поскольку в каждой начальной папке есть детализация.

Я попытался сделать это на python, и я написал небольшой скрипт на python, чтобы найти окончательные каталоги, которые содержат 22 файла:

all_files_dir = r'C:\Users\MBobak\Documents\Loop'

folders = os.listdir(all_files_dir)
ccn_list = [x[-6:] for x in folders]

ccn_file_dir = [r'C:\Users\MBobak\Documents\Loop\Raw Claims Data ' + x + '\D#CJR\Y2018M02\P' + x for x in ccn_list]

Но теперь у меня проблемы с копированием / перемещением в новые папки.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Итак, после некоторых полезных советов и интенсивного поиска в Google, я придумал следующее, которое делает то, что мне нужно. Этот сценарий войдет в каждую папку и переименует каждый файл, поскольку он копирует его в другую папку, которая называется оригинальным именем файла. Окончательный результат содержит 22 папки (как описано в вопросе) по 400 файлов в каждой. Приведенный ниже код содержит фрагмент из основы вопроса.

import os, shutil

dest = r'C:\Users\MBobak\Documents\Target_Folder'
all_folders_dir = r'C:\Users\MBobak\Documents\Staging_Folder'
files_22 = r'C:\Users\MBobak\Documents\Staging_Folder\Raw Claims Data 050069\D#CJR\Y2018M02\P050069' ## pulling list of all the named files 

folders = os.listdir(all_folders_dir)
files = os.listdir(files_22)
ccn_list = [x[-6:] for x in folders]
ccn_file_dir = [r'C:\Users\MBobak\Documents\Raw Claims Data ' + x + '\D#CJR\Y2018M02\P' + x for x in ccn_list]

for file in files:
    for hosp_folder, ccn in zip(ccn_file_dir, ccn_list):
        if not os.path.exists(dest+'\\'+file):
            os.mkdir(dest+'\\'+file)
        shutil.copy(hosp_folder+"\\"+file ,dest +'\\'+ file +'\\'+ file + '_' + ccn)
0 голосов
/ 03 мая 2018

Итак - недостаточно репутации, чтобы комментировать и запрашивать дополнительную информацию. Мне кажется, что у вас есть похожие имена файлов в нижней части структуры, которые вы хотите скопировать в ту же целевую папку?

Т.е. вы хотите, чтобы все файлы ACO попали в папку с именем ACO ??? В папке может быть только один файл с таким именем.

Таким образом, эта первая версия фактически перезапишет любой аналогичный именованный файл в целевой папке. Можете ли вы уточнить, что вам действительно нужно? Т.е. пример содержимого целевой папки и имен файлов.

# folder.py
import os
import sys
import platform
import shutil

walk_dir = sys.argv[1]

if platform.system() == 'Windows':
    delimiter = '\\'
else:
    delimiter = '/'

print('walk_dir = ' + walk_dir)
print('walk_dir (absolute) = ' + os.path.abspath(walk_dir))

for root, subdirs, files in os.walk(walk_dir):
    print('--\ncurrent = ' + root)

    for filename in files:
        file_path = os.path.join(root, filename)

        print('\t- file %s (full path: %s)' % (filename, file_path))
        target_name = root[root.rfind(delimiter)+2:len(root)]
        if not os.path.isdir(filename):
            os.mkdir(filename)
        target = filename + delimiter + filename + target_name
        shutil.copy2(file_path,target)

Назовите это так:

C:\\Users\\MBobak\\Documents\\python folder.py Loop

Если вы сможете дать мне больше информации, я смогу дать вам лучший ответ.

...