我有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..
以下是文件路径,请注意最终文件夹和最后一个文件夹中的第4个文件夹是唯一的
'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
。我附上了一张图片来展示它的样子。
我知道有很多方法可以在命令行中执行此操作,但我找不到此问题的具体示例,因为每个初始文件夹都有下钻。
我试图在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]
但现在我无法将这些文件复制/移动到新文件夹中。
答案 0 :(得分:3)
所以 - 没有足够的声誉评论并要求更多信息。对我来说,你觉得你想要复制到同一目标文件夹的结构底部有类似的文件名吗?
即您希望所有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
如果你能给我更多信息,我可能会给你一个更好的答案。
答案 1 :(得分:1)
因此,经过一些有用的建议和激烈的谷歌搜索,我想出了下面的内容,它做了我需要的。此脚本将进入每个文件夹并重命名每个文件,因为它将其复制到另一个文件夹中,该文件夹标题为原始文件名。最终结果有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)