python使用os.walk獲取文件夾的大小-一行代碼

主要內容

使用 os.path.getsize(path) 能夠獲取到文件的大小,可是若是path是一個文件夾而不是文件的話,雖然也有數值返回,可是並非這個文件夾真正的大小。至少windows上是這樣的。Linux可能沒問題(畢竟一切皆文件)。不如既然能夠獲取到文件的大小,那麼遍歷以便全部文件,文件夾大小也就有了。
使用 os.walk(path) 就能夠遍歷目錄下的全部目錄和文件,包括子目錄:python

import os
folder_path = r'E:\Downloads'
for parent, dirs, files in os.walk(folder_path):
    # 輸出文件夾信息
    for dir in dirs:
        print('parent is :', parent)
        print('dirname is ', dir)
    # 輸出文件信息
    for file in files:
        print('parent is :', parent)
        print('filename is :', file)
        # 文件的完整路徑
        fullname = os.path.join(parent, file)
        print('the fulll name of the file is :', fullname)
        file_size = os.path.getsize(fullname)/1024/1024
        print('the file size is : %.2f MB' % file_size)

上面的例子中,第一個for循環是遍歷文件夾的,咱們只要文件,也就是隻要第二個for循環,把其中每一項加起來windows

# 獲取文件夾的大小
import os
folder_path = r'E:\Downloads'
full_size = 0
for parent, dirs, files in os.walk(folder_path):
    for file in files:
        fullname = os.path.join(parent, file)
        file_size = os.path.getsize(fullname)
        full_size += file_size
print(full_size, "%.2f MB" % (full_size/1024/1024))

把裏層的for循環寫成迭代器,再用sum來替代 full_size += file_size :ide

import os
folder_path = r'E:\Downloads'
full_size = 0
for parent, dirs, files in os.walk(folder_path):
    full_size = sum(os.path.getsize(os.path.join(parent, file)) for file in files)
print(full_size, "%.2f MB" % (full_size/1024/1024))

再把最外面的for循環也剝掉,就成了下面的一行代碼了。
一行代碼:code

full_size = sum(sum(os.path.getsize(os.path.join(parent, file)) for file in files) for parent, dirs, files in os.walk(folder_path))

完美,徹底看不懂了。get

補充

關於嵌套2層for循環的寫法,上面用了括號。更簡介的寫法是把括號去掉,把外層的for寫在前面:it

for i in a:
    for j in i:
        print(j)

[j for i in a for j in i]
相關文章
相關標籤/搜索