gpt4 book ai didi

python - 为什么创建文件夹后没有复制所有文件

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:30 24 4
gpt4 key购买 nike

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

谁能帮我弄清楚这是为什么?

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

最佳答案

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

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

当你用“.”分割文件名时,返回的值是一个列表,而不是一个字符串。那是你的变量 folderName - 不是一个精心挑选的名字。您的表达式 os.path.exists(str(folderName)) 将始终为 False,因为 str() 函数不会从列表中重建一个简单的字符串。

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

如果您在一个已经存在的目录上调用 mkdir/makedirs,此时会引发 OSError 异常。然后不会进行文件复制。

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

你捕获了一个 OSError 但不对它做任何事情,除非它是 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)

关于python - 为什么创建文件夹后没有复制所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45021392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com