Python 为什么创建文件夹后不复制所有文件

Python 为什么创建文件夹后不复制所有文件,python,Python,我尝试遍历文件夹,根据文件扩展名创建文件夹,然后复制此文件夹中的所有相关文件。但由于一个意外的原因,只复制了一个文件,脚本在下一个文件上切换。我认为基础是好的,因为文件夹被正确创建,一个文件被复制。那么为什么所有其他的都没有被复制呢 有人能帮我找出原因吗 import os import shutil dir = "/home/user/Documents/utils/testFindAndCopy" target = "/home/user/Documents/utils/result"

我尝试遍历文件夹,根据文件扩展名创建文件夹,然后复制此文件夹中的所有相关文件。但由于一个意外的原因,只复制了一个文件,脚本在下一个文件上切换。我认为基础是好的,因为文件夹被正确创建,一个文件被复制。那么为什么所有其他的都没有被复制呢

有人能帮我找出原因吗

import os
import shutil

dir = "/home/user/Documents/utils/testFindAndCopy"
target = "/home/user/Documents/utils/result"

def createDir(target):
    os.makedirs(str(target))

def copyFiles(file, target):
    shutil.copy2(file, target)


for subdir, dirs, files in os.walk(dir):
    for file in files:
        filepath = subdir + os.sep + file
        folderName = file.split('.')
        targetDir = target + '/' + str(folderName[1])
        try:
            if os.path.exists(str(folderName)):
                print(folderName[1])
                print(targetDir)
                print(filepath)
                copyFiles(filepath, targetDir)
            else:
                createDir(str(targetDir))
                copyFiles(filepath, targetDir)
                print(folderName[1])
                print(targetDir)
                print(filepath)
        except OSError, e:
            if e.errno != 17:
                raise
                # time.sleep might help here
            pass
使用
shutil.copytree(src,dst)

你甚至不必带着它走文件树。只需将顶级目录设置为源

从:

递归复制以src为根的整个目录树,返回目标目录。由dst命名的目标目录必须不存在;它将被创建,同时丢失父目录。使用copystat()复制目录的权限和时间,使用shutil.copy2()复制单个文件


这里有几个错误。文件和目录操作很棘手,因此需要非常小心

您应该使用os.path.join来构建文件路径

在“.”上拆分文件名时,返回的值是列表,而不是字符串。这是您的变量
folderName
——不是一个很好选择的名称。表达式
os.path.exists(str(folderName))
将始终为False,因为str()函数不会从列表中重新构造简单字符串

文件名可以包含多个点。当您使用
folderName[1]
作为目录名时,您假设您的案例中没有这样的文件名。 如果使用
folderName[-1]
您将始终获得文件名的最后一部分

如果在已经存在的目录上调用mkdir/makedirs,则此时会引发OSError异常。这样就不会进行文件复制

shutil.copy2复制一个文件,即使您通过名为
copyFiles
的函数调用它

你抓住了一个错误,但除非是17岁,否则什么都不要做。因此,您将不知道脚本是否捕捉到错误

您希望主循环是这样的:

for subdir, dirs, files in os.walk(dir):
    for file in files:
        filepath = os.path.join(subdir, file)
        folderName = file.split('.')
        targetDir = os.path.join(target, folderName[-1])
        try:
            print(targetDir, filepath, os.path.exists(targetDir))
            if not os.path.exists(targetDir):
                createDir(targetDir)
            shutil.copy2(filepath, targetDir)

copyFiles可能正在覆盖现有文件。为什么不使用
os.rename
?@COLDSPEED我需要复制源目录中的所有文件。所有文件都有不同的名称name@COLDSPEED
os.rename
相当于bash中的
mv
,只会移动文件,不是吗?我不确定您的文件名/路径名操作是否正确。检查是否存在
folderName
,然后创建
targetDir
。我注意到,无论采用
if
语句的哪个分支,您都会打印完全相同的内容。你为什么不换一张打印出来的报表,看看你得到了什么?谢谢你的回答,非常清楚。我理解所有要点,理解我的错误是有帮助的。我应用了你的建议,效果很好!非常感谢!很高兴它对你有用。如果你不介意,请接受答案。