Python将所有文件从多个子目录移至不同的相应子目录

时间:2018-07-10 01:10:19

标签: python

我正在处理一个python脚本,它将一个文件夹内子文件夹中的所有文件移到另一个具有相同子文件夹结构的文件夹中。 (见图)

picture

我的脚本当前仅从目录中获取所有文件,然后移动到另一个文件夹位置。有没有一种优雅的方法可以做到这一点?我正在处理文件夹中的31个子目录,因此对所有31个子目录进行硬编码将很繁琐

非常感谢

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-132-fa95f1dffabc> in <module>()
     24 plt.ylim([0, 10])
     25 plt.title('Dataset')
---> 26 plt.scatter(centroids, len(df1))
     27 plt.show()
     28 

~/anaconda3/lib/python3.6/site-packages/matplotlib/pyplot.py in scatter(x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, hold, data, **kwargs)
   3376                          vmin=vmin, vmax=vmax, alpha=alpha,
   3377                          linewidths=linewidths, verts=verts,
-> 3378                          edgecolors=edgecolors, data=data, **kwargs)
   3379     finally:
   3380         ax._hold = washold

~/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py in inner(ax, *args, **kwargs)
   1715                     warnings.warn(msg % (label_namer, func.__name__),
   1716                                   RuntimeWarning, stacklevel=2)
-> 1717             return func(ax, *args, **kwargs)
   1718         pre_doc = inner.__doc__
   1719         if pre_doc is None:

~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py in scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, **kwargs)
   3953         y = np.ma.ravel(y)
   3954         if x.size != y.size:
-> 3955             raise ValueError("x and y must be the same size")
   3956 
   3957         if s is None:

ValueError: x and y must be the same size

3 个答案:

答案 0 :(得分:0)

您可以使用os.path.relpath获取到src的相对路径,然后将相对路径与dst合并以获得新的路径名:

import shutil
import os
src = r'C:\folderA'
dst = r'C:\folderB'

for root, subdirs, files in os.walk(src):
    for file in files:
        path = os.path.join(root, file)
        shutil.move(path, os.path.join(dst, os.path.relpath(path, src)))

答案 1 :(得分:0)

要处理多个目录,可以构建{'src':'dest'}对字典:

import shutil
import os
src_dst_map = {
   r'C:\folderA' : r'C:\folderB',
   r'C:\folderC' : r'C:\folderD'
} #ect

for src, dst in src_dst_map.items():
   for root, subdirs, files in os.walk(src):
      for file in files:
         path = os.path.join(root, file)
         shutil.move(path, dst)

答案 2 :(得分:0)

首先,如果您有意要修改IIRC,请致电copytree并通过move而不是copy2作为复印机,这样一来,所有复印机文件放置在正确的位置,但是在Unix或Windows(我忘记了)上,它留下的是空目录而不是空目录。但这很简单:

shutil.copytree(src, dst, function=shutil.move)
shutil.rmtree(src)

如果您不想要某些骇人听闻的东西:

在您的图中,似乎您只有31个子目录都直接位于源目录下,而不是相互嵌套。因此,尝试使用walk递归遍历整个层次结构,然后尝试正确地重组路径,等等,这只会使事情变得更复杂,甚至可能效率更低。

您要做的就是获取这31个目录,并move。例如,使用scandir

for entry in os.scandir(src):
    if entry.is_dir():
        shutil.move(entry.path, dst)

或者,如果您在顶层具有文件和目录,则更为简单:

for entry in os.scandir(src):
    shutil.move(entry.path, dst)

如果您使用的是没有scandir的旧版本的Python,则必须使用listdir,但这只是有点困难:

for name in os.listdir(src):
    shutil.move(os.path.join(src, name), dst)