【问题标题】:How to combine similar named files from multiple folders into one folder for each file name如何为每个文件名将多个文件夹中的相似命名文件合并到一个文件夹中
【发布时间】:2018-05-03 17:19:21
【问题描述】:

我有 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。我附上了一张图片来展示它的样子。

我知道有一些方法可以在命令行中执行此操作,但我找不到此问题的具体示例,因为每个初始文件夹都有向下钻取。

我尝试在 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]

但现在我无法将它们复制/移动到新文件夹中。

【问题讨论】:

  • ACO 文件夹中是否应该有名为“ACO050168”、“ACO150074”、“ACO150128”等的文件?或者,...应该叫什么名字?
  • 我刚刚意识到您不能在一个文件夹中使用相同的名称两次...像您一样更改名称是理想的。

标签: python command-line copy


【解决方案1】:

所以 - 没有足够的声誉来评论和询问更多信息。对我来说,听起来您在结构底部有相似的文件名,您想将它们复制到同一个目标文件夹?

也就是说,您希望所有 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

如果你能给我更多的信息,我可能会给你一个更好的答案。

【讨论】:

  • 我更新了问题。感谢 cmets @cpaludan
  • 我的荣幸 - 看看更新版本是否不适合您。
  • 我对此有点困惑。 1. 最后一个 for 循环没有任何后续行缩进。 2.据我了解,我需要保存为.py 并在cmd 中运行它,但我不确定在哪里显式调用路径。我看到你写了Loop,但是当我尝试这样做时,我没有得到任何回应。
  • 我很抱歉最后一个 for 循环中的缩进 - 这是我更新代码时的错误。除了您在下面执行的更具体的目的地之外,此代码可以满足您的需要。它将在您运行脚本的同一文件夹中创建 22 个文件夹。
【解决方案2】:

所以在一些有用的建议和激烈的谷歌搜索之后,我想出了下面的这个,它可以满足我的需要。该脚本将进入每个文件夹并在将每个文件复制到另一个文件夹时重命名,该文件夹名为原始文件名。最终结果有 22 个文件夹(如问题中所述),每个文件夹有 400 个文件。下面的代码包含问题词干中的 sn-p。

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)

【讨论】:

  • * 好答案 *
猜你喜欢
  • 2020-09-05
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 2019-06-18
  • 2017-06-18
  • 1970-01-01
相关资源
最近更新 更多