【问题标题】:IsADirectoryError: [Errno 21] Is a directory: '/' while copying files from one folder to another existing folder PythonIsADirectoryError:[Errno 21] 是目录:'/',同时将文件从一个文件夹复制到另一个现有文件夹 Python
【发布时间】:2021-02-25 03:01:00
【问题描述】:

我正在制作一个基本的文件管理器来练习。我在尝试将文件从一个目录复制到另一个已经存在的目录时遇到了麻烦。

def singulateDataInDir(SRCdir, passBackFiles=bool, passBackDirs=bool):
    for root, dirs, files in os.walk(SRCdir, topdown=True):
        for name in files:
            filesInSRCdir = os.path.join(root, name)
            if passBackFiles is True:
                return filesInSRCdir
        for name in dirs:
            dirsInSRCdir = os.path.join(root, name)
            if passBackDirs is True:
                return dirsInSRCdir

def copyFilesFromSRCtoDEST(SRCdir, DESTdir):  
    for files in singulateDataInDir(SRCdir, True, False):
        shutil.copy2(files, DESTdir)

我尝试对 SRCdir 中的项目进行排序,并根据它返回文件、目录或两者的参数进行排序。 我收到一条错误消息,说我的目的地是一个目录(我认为?也许“/”表示我输入的代码不正确。)

Traceback (most recent call last):
  File "main.py", line 45, in <module>
    main(True)
  File "main.py", line 38, in main
    code.copyFilesFromSRCtoDEST(srcOpt, destOpt)
  File "/Users/jcrd/Documents/csProjects/pythonProjects/screenshotCollecting/code.py", line 34, in copyFilesFromSRCtoDEST
    shutil.copy2(files, DESTdir)
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/shutil.py", line 432, in copy2
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/shutil.py", line 261, in copyfile
    with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
IsADirectoryError: [Errno 21] Is a directory: '/'

任何帮助都会很棒,感谢您查看我的问题。

【问题讨论】:

  • 你用的是windows还是linux
  • 复制前请打印filesDESTdir
  • @rcvaram 我在 Mac 上
  • @KlausD。我添加了一个打印件,我得到了/Users/jcrd/Documents/pics2/.DS_Store,这真的让我感到困惑,因为我正在复制的文件夹中唯一的东西是 Minecraft 屏幕截图
  • 以句点开头的文件和文件夹隐藏在许多 GUI 文件管理器中。试试ls -al

标签: python python-3.x


【解决方案1】:

问题在于singulateDataInDir 不会产生文件名,也不是生成器。它返回带有return filesInSRCdir 的单个路径,所以

for files in singulateDataInDir(SRCdir, True, False):

迭代返回的名称中的字符,从前导正斜杠“/”开始。因此错误Is a directory: '/'。修复是yield 而不是return。您还需要摆弄函数的默认参数。 bool 是一个类型对象,并不意味着输入必须是布尔值。

def singulateDataInDir(SRCdir, passBackFiles=False, passBackDirs=False):
    for root, dirs, files in os.walk(SRCdir, topdown=True):
        for name in files:
            filesInSRCdir = os.path.join(root, name)
            if passBackFiles is True:
                yield filesInSRCdir
        for name in dirs:
            dirsInSRCdir = os.path.join(root, name)
            if passBackDirs is True:
                yield dirsInSRCdir

def copyFilesFromSRCtoDEST(SRCdir, DESTdir):  
    for files in singulateDataInDir(SRCdir, True, False):
        shutil.copy2(files, DESTdir)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2023-01-14
    相关资源
    最近更新 更多