【问题标题】:How to deal with OSError: [Errno 20] Not a directory: '.DS_Store'?如何处理 OSError: [Errno 20] Not a directory: '.DS_Store'?
【发布时间】:2017-05-22 04:29:12
【问题描述】:

我想从一个目录复制一些图片到另一个目录,这是我的代码:

import os.path
import shutil

def copyFile(sourceDir,targetDir):
    for files in os.listdir(sourceDir):
        sourceFile=os.path.join(sourceDir,files)
        if os.path.isfile(sourceFile) and sourceFile.find('.jpg')>0:
            shutil.copy(sourceFile,targetDir) 

for i in os.listdir('/Users/liuchong/Desktop/LFW/new'):

    copyFile(i,'/Users/liuchong/Desktop/LFW/lfw')  

但是当我运行它时,终端告诉我OSError: [Errno 20] Not a directory: '.DS_Store' 我知道 'DS_dstore' 是 Mac 中的一个隐藏文件,但是我该如何解决这个错误呢?

【问题讨论】:

  • 请修正你的缩进。

标签: python macos python-2.7 shutil


【解决方案1】:

值得一提的是“不是目录”错误(Errno 20)的一般含义。这意味着您正在尝试使用子路径是真实文件而不是目录的路径进行操作。那就是它是一个畸形的、不正确的路径。

示例:file.txt/test.txt 其中 file.txt 是现有的真实文件(不是目录)。

对于此类文件的每个 I/O 操作,Python 都会返回此错误:

$ python -c 'import os; os.path.getsize("file.txt/test.txt");'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python2.7/genericpath.py", line 57, in getsize
    return os.stat(filename).st_size
OSError: [Errno 20] Not a directory: 'file.txt/test.txt'

操作系统也会返回此错误:

$ stat file.txt/test.txt
stat: cannot stat 'file.txt/test.txt': Not a directory

每次出现此错误时,都意味着您在程序中的某处连接了文件+文件。

此错误是特定于 Unix 操作系统的。在 Windows 上,对于这种格式错误的路径,您应该得到“找不到文件”。

【讨论】:

    【解决方案2】:

    你的逻辑似乎很糟糕。您遍历目录中的所有文件,将每个文件传递给copyFile。但是该函数中,您再次尝试遍历传递给函数的“目录”中的每个文件:除了您不只将目录传递给函数之外,您还传递了找到的每个文件在原始目录中。

    目前尚不清楚您要做什么,但我认为您需要删除其中一个对 listdir 的调用以及相关的循环。

    【讨论】:

    • 我在'/Users/liuchong/Desktop/LFW/lfw'目录中有很多文件夹,我想将这些文件夹中的文件移动到一个目录中。
    【解决方案3】:

    当您执行os.listdir('/Users/liuchong/Desktop/LFW/lfw') 时,它会返回目录和文件。在将其作为参数传递之前,您必须检查目录条目。

    def copyFile(sourceDir,targetDir):
        for files in os.listdir(sourceDir):
            sourceFile=os.path.join(sourceDir,files)
            if os.path.isfile(sourceFile) and sourceFile.find('.jpg')>0:
                shutil.copy(sourceFile,targetDir)
    
    for i in os.listdir('/Users/liuchong/Desktop/LFW/lfw'):
         if os.path.isdir(i):
             i = os.path.join( '/Users/liuchong/Desktop/LFW/lfw', i)
             copyFile(i,'/Users/liuchong/Desktop/LFW/lfw')
    

    【讨论】:

    • 谢谢,我添加了这一行 'if os.path.isdir(i)' 但代码没有运行。然后我打印'i'的类型,输出是'str'......
    • 在将目录传递给函数之前,您必须添加i = os.path.join( '/Users/liuchong/Desktop/LFW/lfw', i)
    【解决方案4】:
    os.listdir('/Users/liuchong/Desktop/LFW/lfw')
    

    返回一个列表,其中包含用户给定的目录中的条目名称。列表基于随机选择。

    为了解决这个问题(我知道我迟到了),这里有一个python 3 兼容代码:-

    import time
    import os
    from shutil import copyfile
    
    def Copyfile(in_path, out_path, quantity = None):
    
        filelist = os.listdir(in_path)
        counter = 0
        print("Copying to %r directory. Please wait... " % out_path)
    
        start = time.time()
    
        for i in range(quantity):
            copyfile(filelist[i], out_path+filelist[i])
            counter+=1
            sys.stdout.write("\rTotal images copied : %r" % counter)
            sys.stdout.flush()   
    
        end = time.time()
        print("This move operation took %r seconds to run." %(end - start))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 2016-09-12
      • 2021-04-09
      • 2019-05-05
      • 2020-11-08
      • 1970-01-01
      相关资源
      最近更新 更多