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