如何在Mac上的Python中修复“ NotADirectoryError”

时间:2019-10-16 03:31:54

标签: python python-3.x os.walk

我正在尝试浏览计算机上的所有文件,并创建一个大于100MB的文件列表。但是,在浏览文件时,我不断收到“ NotADirectoryError”。以我理解代码的方式,它应该在第二个for循环中查找基本文件,所以我不知道为什么“ NotADirectory”错误不断出现。

我在使用Python3.7.4的Mac上。我尝试为'NotADirectoryError'添加一个例外,但是它给了我一个'FileNotFound错误',因此我认为在例外上添加例外不是解决此问题的最佳方法。

我认为我误解了os.walk或os.path.getsize的工作原理,但是在查阅了两者的文档后,我仍然对自己的错感到困惑。

big_dict= {}

folder = os.path.abspath('/Users/')

#walking thru all the folders on my computer
for folders, subfolders, filenames in os.walk(folder):
    #for each file that's bigger than 100 MB, add it to the 'big_dict'
    for filename in filenames:
        filename = os.path.join(folder, filename) +'/'
        file_size = os.path.getsize(filename) -- this line always gives the error
    #convert size to MB, add to big_dict as value with filename key
        if file_size > 1000000:
            big_dict[filename] = str(file_size/10000) + ' MB'
Traceback (most recent call last):
  File "/Users/jonbauer/size_check.py", line 17, in <module>
    file_size = os.path.getsize(filename)
  File "/Applications/Thonny.app/Contents/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/../../../../../../../Python.framework/Versions/3.7/lib/python3.7/genericpath.py", line 50, in getsize
    return os.stat(filename).st_size
NotADirectoryError: [Errno 20] Not a directory: '/Users/.localized/'

这是我在运行代码时收到的错误消息。正如我之前所说,我试图遍历所有文件并将较大的文件添加到列表中,但是我一直遇到此错误。

1 个答案:

答案 0 :(得分:1)

big_dict= {}

folder = os.path.abspath('/Users')

for root, _, filenames in os.walk(folder):
  for filename in filenames:
    path = os.path.join(root, filename)
    if os.path.islink(path):
      continue
    file_size_mb = os.path.getsize(path) >> 20
    if file_size_mb > 100:
      file_size_mb_str = '{} MB'.format(file_size_mb)
      print(path, file_size_mb_str)
      big_dict[path] = file_size_mb_str

您的代码中存在几个问题:

  • filename = os.path.join(folder, filename) +'/'是不正确的,因为folder是基础文件夹(在您的情况下是'/ Users /'),而不是您要行走的实际文件夹。
  • 您需要跳过链接,因为getsize()不会对其起作用
  • file_size > 1000000os.path.getsize()返回字节