我正在处理一个python脚本,它将一个文件夹内子文件夹中的所有文件移到另一个具有相同子文件夹结构的文件夹中。 (见图)
我的脚本当前仅从目录中获取所有文件,然后移动到另一个文件夹位置。有没有一种优雅的方法可以做到这一点?我正在处理文件夹中的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
答案 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)