我想做的和这个问题一样:从多个特定子文件夹复制文件。
但没有答案为我工作。当我在我的Windows cmd中执行py时,它甚至不会进入循环,因为在执行后,我在cmd窗口中没有收到print()
行。
我已经尝试了这个解决方案,从目录中复制文件,但完全忽略该目录中的所有子文件夹。
我已经尝试查看shutil
,但我不认为我可以使用它为我的情况下,因为子文件夹?很重要的一点是,我没有保留子文件夹结构,而是将所有文件移到一个目录中。
这是我现在的文件夹,但不幸的是,输出保持了文件夹结构:
import shutil
import os
# Define the source and destination path
source = "d:\test"
destination = "d:\testSubfolderB"
# code to move the files from sub-folder to main folder.
files = os.listdir(source)
for file in files:
file_name = os.path.join(source, file)
shutil.move(file_name, destination)
print("Files Moved")
issue 1和issue 2:
原始代码中的两个主要问题似乎是os.listdir
不递归到每个子目录中,而只提供文件和目录名称的列表,而不是完整的路径。这里有两个问题
要解决这个问题,可以使用内置的glob
库。根据文档,'**'
的glob模式以及参数recursive=True
将潜入每个子目录并根据需要返回完整文件路径。
注意:如果只需要一个特定的文件类型,模式可以更改为**/*.txt
,或者任何你想要的文件扩展名。
问题3:
另外,shutil.move
命令需要到达目的地的完整路径,包括文件名;而原始代码没有处理。
示例代码:
import os
import shutil
from glob import glob
# Path setup.
path = './filemove'
dest = './filemove_dest'
# Collect files.
files = glob(os.path.join(path, '**'), recursive=True)
# Ensure destination path exists.
if not os.path.isdir(dest):
os.makedirs(dest)
# Move all files.
for f in files:
if os.path.isfile(f):
base = os.path.basename(f)
shutil.move(f, os.path.join(dest, base))
原始文件结构:./dir1
./dir1/dir1_file1
./dir1/dir1_file2
./dir1/dir1_file3
./dir1/dir1_file4
./dir1/dir1_file5
...
./dir5
./dir5/dir5_file1
./dir5/dir5_file2
./dir5/dir5_file3
./dir5/dir5_file4
./dir5/dir5_file5
结果:
./filemove_dest/dir1_file1
./filemove_dest/dir1_file2
./filemove_dest/dir1_file3
...
./filemove_dest/dir5_file3
./filemove_dest/dir5_file4
./filemove_dest/dir5_file5