python os爬取一文件夹下所有文件,获取大小并排序

目录

一、导入库

二、 获取指定文件大小和占用空间

三、递归遍历文件

四、排序 & 封装

五、完整代码


一、导入库

我们需要导入os库来进行文件处理和路径管理问题,math中的ceil函数 

from os import *
from math import *

二、 获取指定文件大小和占用空间

如何获取文件或文件夹大小呢?

我们需要os.path中的getsize语句

如:

from os import *

f = r"C:\Users\LENOVO\Desktop\os_path"
print(path.getsize(f))  # 我这台电脑的输出-> 4546 (字节bit)

python os爬取一文件夹下所有文件,获取大小并排序_第1张图片

那么我们怎么将字节转成我们看得懂的85B、100MB、8GB、等等呢?

我们就来写一个将字节转大小的函数吧:

from os import *
from math import *


def size(a):
    size_list = [1024 * 1024 * 1024 * 1024, 1024 * 1024 * 1024, 1024 * 1024, 1024, 0]  # 1TB,1GB,1MB,1KB,0B对应的字节
    symbol_list = ["TB", "GB", "MB", "KB", "B"]  # 文件大小单位表
    for x in range(5):  # 遍历列表
        if a >= size_list[x]:  # 如果比特值a大于等于1TB,1GB,1MB,1KB或0B也就是单位值为symbol_list[x]详见下表
            try:
                return str("%.2f" % (a / size_list[x])) + symbol_list[x]  # 放回"大小+单位"
            # 我们发现占用空间和大小都是保留两位小数的,所以需要%.2f
            except ZeroDivisionError:  # 说明大小为零
                return str(a) + "B"  # 返回0B


f = r"C:\Users\LENOVO\Desktop\os_path.py"
print(size(path.getsize(f)))  # 我这台电脑的输出-> 4.43KB

我们是怎么实现的的呢?

因为是从大到小判断是否大于1TB,1GB,1MB,1KB,于0B的。

也就是说,大于等于1TB的就用TB如100TB,不大于等于1TB但大于等于1GB的就用单位GB如10GB,不大于等于1GB但大于等于1MB的用单位MB……那为什么不大于1KB但大于等于0B是单位B呢?因为还有一个0B的大小。

那么知道了文件大小,怎么算占用空间呢?

这与是硬盘分区格式有关。
大小是文件的实际大小,而占用空间是占硬盘的实际空间,以FAT32格式为例,硬盘的基本存储单位是簇,在FAT32中一簇是4KB 。那么,也就是说即使文件只有1个字节,在硬盘上也要占到4KB的空间 如果文件是4KB零1个字节,那就要占用8KB的空间,以此类推 结论: 大小是文件的实际大小,而占用空间是占硬盘的实际空间。如图(我这里一簇是4KB,你只要创建一个文本文件看一看它属性中的占用空间就知道了)

python os爬取一文件夹下所有文件,获取大小并排序_第2张图片

 那么如何计算呢 ?

我们只需要给path.getsize(f)÷4096向上取整×4096就是占用空间(这里4096是1簇也就是4KB的字节数)

也就是:

from os import *
from math import *


def size(a):
    size_list = [1024 * 1024 * 1024 * 1024, 1024 * 1024 * 1024, 1024 * 1024, 1024, 0]  # 1TB,1GB,1MB,1KB,0B对应的字节
    symbol_list = ["TB", "GB", "MB", "KB", "B"]  # 文件大小单位表
    for x in range(5):  # 遍历列表
        if a >= size_list[x]:  # 如果比特值a大于等于1TB,1GB,1MB,1KB或0B也就是单位值为symbol_list[x]详见下表
            try:
                return str("%.2f" % (a / size_list[x])) + symbol_list[x]  # 放回"大小+单位"
            # 我们发现占用空间和大小都是保留两位小数的,所以需要%.2f
            except ZeroDivisionError:  # 说明大小为零
                return str(a) + "B"  # 返回0B


f = r"C:\Users\LENOVO\Desktop\os_path.py"
print(size(path.getsize(f)))  # 我这台电脑的输出-> 4.43KB
print(size(int(ceil(path.getsize(f) / 4096)) * 4096))  # 我这台电的输出-> 8.00KB

 我们再来看看:属性后面是不是有一个括号里写着字节?

python os爬取一文件夹下所有文件,获取大小并排序_第3张图片

我们如何添加这个呢?

做法非常简单,代码如下:

from os import *
from math import *


def size(a):
    size_list = [1024 * 1024 * 1024 * 1024, 1024 * 1024 * 1024, 1024 * 1024, 1024, 0]  # 1TB,1GB,1MB,1KB,0B对应的比特值
    symbol_list = ["TB", "GB", "MB", "KB", "B"]  # 文件大小单位表
    for x in range(5):  # 遍历列表
        if a >= size_list[x]:  # 如果比特值a大于等于1TB,1GB,1MB,1KB或0B也就是单位值为symbol_list[x]详见下表
            try:
                return str("%.2f" % (a / size_list[x])) + symbol_list[x]  # 放回"大小+单位"
            # 我们发现占用空间和大小都是保留两位小数的,所以需要%.2f
            except ZeroDivisionError:  # 说明大小为零
                return str(a) + "B"  # 返回0B


f = r"C:\Users\LENOVO\Desktop\os_path.py"
print(size(path.getsize(f))+"(" + str(path.getsize(f)) + "字节" + ")")  # 我这台电脑的输出-> 4.87KB(5037字节)
print(size(int(ceil(path.getsize(f) / 4096)) * 4096)+"(" + str(int(ceil(path.getsize(f) / 4096)) * 4096) + "字节" + ")")  # 我这台电的输出-> 8.00KB(8192字节)

三、递归遍历文件

学会获取指定文件大小和占用空间了,现在就该到遍历文件的部分,我们这次用递归的方式遍历文件,思路很简单:写一个函数scaner_file,利用递归解决问题,遍历路径下的每一个项目,如果是文件,在listdir1列表里加入这个文件的信息,如果是一个文件夹,则递归调用自己这个函数遍历下一层。

from os import *
from math import *


def size(a):
    size_list = [1024 * 1024 * 1024 * 1024, 1024 * 1024 * 1024, 1024 * 1024, 1024, 0]  # 1TB,1GB,1MB,1KB,0B对应的比特值
    symbol_list = ["TB", "GB", "MB", "KB", "B"]  # 文件大小单位表
    for x in range(5):  # 遍历列表
        if a >= size_list[x]:  # 如果比特值a大于等于1TB,1GB,1MB,1KB或0B也就是单位值为symbol_list[x]详见下表
            try:
                return str("%.2f" % (a / size_list[x])) + symbol_list[x]  # 放回"大小+单位"
            # 我们发现占用空间和大小都是保留两位小数的,所以需要%.2f
            except ZeroDivisionError:  # 说明大小为零
                return str(a) + "B"  # 返回0B


global listdir1

listdir1 = []  # 定义全局变量listdir1


def scaner_file(url):
    """

    遍历url路径下的所有文件

    :param url: 类型str, 需要搜索的路径
    """
    file = listdir(url)
    chdir(url)
    for f in file:
        real_url = path.join(url, f)  # 拼接字符串:路径url和文件或文件夹名称
        if path.isfile(real_url):  # 如果路径为文件
            try:
                if (not f.startswith("~")) and (not f.startswith("$")):  # 如果不是临时文件
                    listdir1.append([real_url, size(path.getsize(f)) + "(" + str(path.getsize(f)) + "字节" + ")",
                                     size(int(ceil(path.getsize(f) / 4096)) * 4096),
                                     path.getsize(f)])  # 在列表中加入这个文件的信息[路径,文件大小,文件占用空间,字节数(便于以后判断)]
            except FileNotFoundError:  # 如果没有找到文件
                pass  # 不做任何操作
        elif path.isdir(real_url):
            # 如果是目录,则是递归调用自定义函数 scaner_file (url)多次
            if (not f.startswith("~")) and (not f.startswith("$")):  # 不是临时文件
                scaner_file(real_url)  # 递归调用自己


scaner_file(input("请输入路径:"))  # 输入路径并进行递归
print(listdir1)

我们试一试:输入D:\(D盘)

C:\Users\LENOVO\AppData\Local\Programs\Python\Python39\python.exe C:/Users/LENOVO/Desktop/os_path.py
请输入路径:D:\
Traceback (most recent call last):
  File "C:\Users\LENOVO\Desktop\os_path.py", line 47, in 
    scaner_file(input("请输入路径:"))  # 输入路径并进行递归
  File "C:\Users\LENOVO\Desktop\os_path.py", line 44, in scaner_file
    scaner_file(real_url)  # 递归调用自己
  File "C:\Users\LENOVO\Desktop\os_path.py", line 29, in scaner_file
    file = listdir(url)
PermissionError: [WinError 5] 拒绝访问。: 'D:\\System Volume Information'

我们发现它报错拒绝访问'D:\\System Volume Information',在C盘和D盘中,有一些文件和文件夹是拒绝访问的,例如我是Windows10,我列出了一些:

mission = ["D:\\System Volume Information", "C:\\Documents and Settings",
           "C:\\Program Files\\Windows Defender Advanced Threat Protection\\Classification\\Configuration",
           "C:\\Program Files\\Windows NT\\附件", "C:\\ProgramData\\Application Data", "C:\\ProgramData\\Documents",
           "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\程序", "C:\\ProgramData\\Microsoft\\Windows\\SystemData",
           "C:\\ProgramData\\Microsoft\\Windows Defender Advanced Threat Protection",
           "C:\\ProgramData\\Microsoft\\WwanSvc\\DMProfiles", "C:\\ProgramData\\Microsoft\\WwanSvc\\Profiles",
           "C:\\ProgramData\\Packages\\Microsoft.XboxGamingOverlay_8wekyb3d8bbwe\\S-1-5-21-1551970388-401600794-1189712708-1001\\SystemAppData\\Helium",
           "C:\\ProgramData\\Packages\\Microsoft.YourPhone_8wekyb3d8bbwe\\S-1-5-21-1551970388-401600794-1189712708-1001\\SystemAppData\\Helium",
           "C:\\ProgramData\\Templates", "C:\\ProgramData\\「开始」菜单", "C:\\ProgramData\\桌面",
           "C:\\System Volume Information",
           "C:\\Users\\All Users", "C:\\Users\\Default", "C:\\Users\\Default User", "C:\\Users\\LENOVO\\AppData\\Local",
           "C:\\Users\\LENOVO\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\程序"
           "C:\\Users\\LENOVO\\Application Data"]

我们把判断是否为非法访问内容的功能加入到程序中:

from os import *
from math import *


def size(a):
    size_list = [1024 * 1024 * 1024 * 1024, 1024 * 1024 * 1024, 1024 * 1024, 1024, 0]  # 1TB,1GB,1MB,1KB,0B对应的比特值
    symbol_list = ["TB", "GB", "MB", "KB", "B"]  # 文件大小单位表
    for x in range(5):  # 遍历列表
        if a >= size_list[x]:  # 如果比特值a大于等于1TB,1GB,1MB,1KB或0B也就是单位值为symbol_list[x]详见下表
            try:
                return str("%.2f" % (a / size_list[x])) + symbol_list[x]  # 放回"大小+单位"
            # 我们发现占用空间和大小都是保留两位小数的,所以需要%.2f
            except ZeroDivisionError:  # 说明大小为零
                return str(a) + "B"  # 返回0B


global listdir1
global mission

listdir1 = []  # 定义全局变量listdir1
mission = ["D:\\System Volume Information", "C:\\Documents and Settings",
           "C:\\Program Files\\Windows Defender Advanced Threat Protection\\Classification\\Configuration",
           "C:\\Program Files\\Windows NT\\附件", "C:\\ProgramData\\Application Data", "C:\\ProgramData\\Documents",
           "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\程序", "C:\\ProgramData\\Microsoft\\Windows\\SystemData",
           "C:\\ProgramData\\Microsoft\\Windows Defender Advanced Threat Protection",
           "C:\\ProgramData\\Microsoft\\WwanSvc\\DMProfiles", "C:\\ProgramData\\Microsoft\\WwanSvc\\Profiles",
           "C:\\ProgramData\\Packages\\Microsoft.XboxGamingOverlay_8wekyb3d8bbwe\\S-1-5-21-1551970388-401600794-1189712708-1001\\SystemAppData\\Helium",
           "C:\\ProgramData\\Packages\\Microsoft.YourPhone_8wekyb3d8bbwe\\S-1-5-21-1551970388-401600794-1189712708-1001\\SystemAppData\\Helium",
           "C:\\ProgramData\\Templates", "C:\\ProgramData\\「开始」菜单", "C:\\ProgramData\\桌面",
           "C:\\System Volume Information",
           "C:\\Users\\All Users", "C:\\Users\\Default", "C:\\Users\\Default User", "C:\\Users\\LENOVO\\AppData\\Local",
           "C:\\Users\\LENOVO\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\程序"
           "C:\\Users\\LENOVO\\Application Data"]  # 部分非法访问内容


def scaner_file(url):
    """

    遍历url路径下的所有文件

    :param url: 类型str, 需要搜索的路径
    """
    if url in mission:
        return 0
    else:
        file = listdir(url)
        chdir(url)
        for f in file:
            real_url = path.join(url, f)  # 拼接字符串:路径url和文件或文件夹名称
            if path.isfile(real_url):  # 如果路径为文件
                try:
                    if (not f.startswith("~")) and (not f.startswith("$")):  # 如果不是临时文件
                        listdir1.append([real_url, size(path.getsize(f)) + "(" + str(path.getsize(f)) + "字节" + ")",
                                         size(int(ceil(path.getsize(f) / 4096)) * 4096),
                                         path.getsize(f)])  # 在列表中加入这个文件的信息[路径,文件大小,文件占用空间,字节数(便于以后判断)]
                except FileNotFoundError:  # 如果没有找到文件
                    pass  # 不做任何操作
            elif path.isdir(real_url):
                # 如果是目录,则是递归调用自定义函数 scaner_file (url)多次
                if (not f.startswith("~")) and (not f.startswith("$")):  # 不是临时文件
                    scaner_file(real_url)  # 递归调用自己


scaner_file(input("请输入路径:"))  # 输入路径并进行递归
print(listdir1)

 输出结果:

python os爬取一文件夹下所有文件,获取大小并排序_第4张图片

四、排序 & 封装

想在就是排序的内容了,我们用sort函数给列表中的文件从小到大排序:

from os import *
from math import *


def size(a):
    size_list = [1024 * 1024 * 1024 * 1024, 1024 * 1024 * 1024, 1024 * 1024, 1024, 0]  # 1TB,1GB,1MB,1KB,0B对应的比特值
    symbol_list = ["TB", "GB", "MB", "KB", "B"]  # 文件大小单位表
    for x in range(5):  # 遍历列表
        if a >= size_list[x]:  # 如果比特值a大于等于1TB,1GB,1MB,1KB或0B也就是单位值为symbol_list[x]详见下表
            try:
                return str("%.2f" % (a / size_list[x])) + symbol_list[x]  # 放回"大小+单位"
            # 我们发现占用空间和大小都是保留两位小数的,所以需要%.2f
            except ZeroDivisionError:  # 说明大小为零
                return str(a) + "B"  # 返回0B


global listdir1
global mission

listdir1 = []  # 定义全局变量listdir1
mission = ["D:\\System Volume Information", "C:\\Documents and Settings",
           "C:\\Program Files\\Windows Defender Advanced Threat Protection\\Classification\\Configuration",
           "C:\\Program Files\\Windows NT\\附件", "C:\\ProgramData\\Application Data", "C:\\ProgramData\\Documents",
           "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\程序", "C:\\ProgramData\\Microsoft\\Windows\\SystemData",
           "C:\\ProgramData\\Microsoft\\Windows Defender Advanced Threat Protection",
           "C:\\ProgramData\\Microsoft\\WwanSvc\\DMProfiles", "C:\\ProgramData\\Microsoft\\WwanSvc\\Profiles",
           "C:\\ProgramData\\Packages\\Microsoft.XboxGamingOverlay_8wekyb3d8bbwe\\S-1-5-21-1551970388-401600794-1189712708-1001\\SystemAppData\\Helium",
           "C:\\ProgramData\\Packages\\Microsoft.YourPhone_8wekyb3d8bbwe\\S-1-5-21-1551970388-401600794-1189712708-1001\\SystemAppData\\Helium",
           "C:\\ProgramData\\Templates", "C:\\ProgramData\\「开始」菜单", "C:\\ProgramData\\桌面",
           "C:\\System Volume Information",
           "C:\\Users\\All Users", "C:\\Users\\Default", "C:\\Users\\Default User", "C:\\Users\\LENOVO\\AppData\\Local",
           "C:\\Users\\LENOVO\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\程序"
           "C:\\Users\\LENOVO\\Application Data"]  # 部分非法访问内容


def scaner_file(url):
    """

    遍历url路径下的所有文件

    :param url: 类型str, 需要搜索的路径
    """
    if url in mission:
        return 0
    else:
        file = listdir(url)
        chdir(url)
        for f in file:
            real_url = path.join(url, f)  # 拼接字符串:路径url和文件或文件夹名称
            if path.isfile(real_url):  # 如果路径为文件
                try:
                    if (not f.startswith("~")) and (not f.startswith("$")):  # 如果不是临时文件
                        listdir1.append([real_url, size(path.getsize(f)) + "(" + str(path.getsize(f)) + "字节" + ")",
                                         size(int(ceil(path.getsize(f) / 4096)) * 4096),
                                         path.getsize(f)])  # 在列表中加入这个文件的信息[路径,文件大小,文件占用空间,字节数(便于以后判断)]
                except FileNotFoundError:  # 如果没有找到文件
                    pass  # 不做任何操作
            elif path.isdir(real_url):
                # 如果是目录,则是递归调用自定义函数 scaner_file (url)多次
                if (not f.startswith("~")) and (not f.startswith("$")):  # 不是临时文件
                    scaner_file(real_url)  # 递归调用自己


scaner_file(input("请输入路径:"))  # 输入路径并进行递归
listdir1.sort(key=lambda obj: obj[3])  # 给listdir1排序,使用列表中的第4项,也就是字节数作为key
for item in listdir1:  # 遍历列表
    print("-" * 50)  # 绘制分隔符
    for it in item:  # 遍历对象中的每一个元素
        print(it)  # 输出

输出:(截取了一段)

D:\MixlyV1.4.4\MixlyforWindows\Microduino-IDE\hardware\tools\avr\lib\gcc\avr\4.9.2\include\stdfix.h
6.77KB(6929字节)
8.00KB
6929
--------------------------------------------------
D:\MixlyV1.4.4\MixlyforWindows\Microduino-IDE\hardware\tools\avr\avr\lib\avr51\libscanf_flt.a
6.77KB(6936字节)
8.00KB
6936
--------------------------------------------------
D:\MixlyV1.4.4\MixlyforWindows\Microduino-IDE\libraries\ArduinoJson\test\Misc\std_string.cpp
6.78KB(6944字节)
8.00KB
6944
--------------------------------------------------
D:\AppInventor2019ServerEdition_Win\resources\appinventor\DevServer\WEB-INF\lib\appengine-jsr107cache-1.9.46.jar
6.79KB(6953字节)
8.00KB
6953
--------------------------------------------------
D:\AppInventor2019ServerEdition_Win\resources\appinventor\AppEngine\demos\guestbook\war\WEB-INF\lib\appengine-jsr107cache.jar
6.79KB(6954字节)
8.00KB
6954
--------------------------------------------------
D:\AppInventor2019ServerEdition_Win\resources\appinventor\AppEngine\lib\opt\user\jsr107\v1\appengine-jsr107cache-1.9.48.jar
6.79KB(6954字节)
8.00KB
6954
--------------------------------------------------
D:\AppInventor2019ServerEdition_Win\resources\appinventor\AppEngine\lib\user\appengine-jsr107cache-1.9.48.jar
6.79KB(6954字节)
8.00KB
6954
--------------------------------------------------
D:\AppInventor2019ServerEdition_Win\resources\appinventor\DevServer\closure-library\closure\goog\events\imehandler_test.js
6.79KB(6954字节)
8.00KB
6954
--------------------------------------------------
D:\AppInventor2019ServerEdition_Win\resources\appinventor\DevServer\closure-library\closure\goog\vec\vec4d_test.js
6.79KB(6954字节)
8.00KB
6954
--------------------------------------------------
D:\AppInventor2019ServerEdition_Win\resources\appinventor\DevServer\closure-library\closure\goog\vec\vec4f_test.js
6.79KB(6954字节)
8.00KB
6954
--------------------------------------------------
D:\AppInventor2019ServerEdition_Win\resources\appinventor\DevServer\closure-library\closure\goog\locale\genericfontnamesdata.js
6.79KB(6955字节)
8.00KB
6955
--------------------------------------------------
D:\MixlyV1.4.4\MixlyforWindows\Microduino-IDE\hardware\arduino\avr\firmwares\atmegaxxu2\arduino-usbserial\Lib\LightweightRingBuff.h
6.79KB(6955字节)
8.00KB
6955
--------------------------------------------------
D:\AppInventor2019ServerEdition_Win\resources\appinventor\AppEngine\docs\javadoc\com\google\appengine\api\prospectivesearch\package-tree.html
6.79KB(6956字节)
8.00KB
6956
--------------------------------------------------
D:\AppInventor2019ServerEdition_Win\resources\appinventor\DevServer\closure-library\doc\css\article.css
6.80KB(6961字节)
8.00KB
6961
--------------------------------------------------
D:\AppInventor2019ServerEdition_Win\resources\appinventor\DevServer\closure-library\closure\goog\crypt\basen_test.js
6.80KB(6965字节)
8.00KB
6965
--------------------------------------------------
D:\MixlyV1.4.4\MixlyforWindows\Microduino-IDE\hardware\tools\avr\avr\lib\avrxmega5\libscanf_flt.a
6.82KB(6980字节)
8.00KB
6980
--------------------------------------------------
D:\AppInventor2019ServerEdition_Win\resources\appinventor\DevServer\reference\blocks\images\math\number.png
6.82KB(6986字节)
8.00KB
6986
---------------------------------------

封装:

if __name__ == "__main__":
    scaner_file(input("请输入路径:"))  # 输入路径并进行递归
    listdir1.sort(key=lambda obj: obj[3])  # 给listdir1排序,使用列表中的第4项,也就是字节数作为key
    for item in listdir1:  # 遍历列表
        print("-" * 50)  # 绘制分隔符
        for it in item:  # 遍历对象中的每一个元素
            print(it)  # 输出

五、完整代码

# -- coding: utf-8 --
from os import *
from math import *


def size(a):
    size_list = [1024 * 1024 * 1024 * 1024, 1024 * 1024 * 1024, 1024 * 1024, 1024, 0]  # 1TB,1GB,1MB,1KB,0B对应的比特值
    symbol_list = ["TB", "GB", "MB", "KB", "B"]  # 文件大小单位表
    for x in range(5):  # 遍历列表
        if a >= size_list[x]:  # 如果比特值a大于等于1TB,1GB,1MB,1KB或0B也就是单位值为symbol_list[x]详见下表
            try:
                return str("%.2f" % (a / size_list[x])) + symbol_list[x]  # 放回"大小+单位"
            # 我们发现占用空间和大小都是保留两位小数的,所以需要%.2f
            except ZeroDivisionError:  # 说明大小为零
                return str(a) + "B"  # 返回0B


global listdir1
global mission

listdir1 = []  # 定义全局变量listdir1
mission = ["D:\\System Volume Information", "C:\\Documents and Settings",
           "C:\\Program Files\\Windows Defender Advanced Threat Protection\\Classification\\Configuration",
           "C:\\Program Files\\Windows NT\\附件", "C:\\ProgramData\\Application Data", "C:\\ProgramData\\Documents",
           "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\程序", "C:\\ProgramData\\Microsoft\\Windows\\SystemData",
           "C:\\ProgramData\\Microsoft\\Windows Defender Advanced Threat Protection",
           "C:\\ProgramData\\Microsoft\\WwanSvc\\DMProfiles", "C:\\ProgramData\\Microsoft\\WwanSvc\\Profiles",
           "C:\\ProgramData\\Packages\\Microsoft.XboxGamingOverlay_8wekyb3d8bbwe\\S-1-5-21-1551970388-401600794-1189712708-1001\\SystemAppData\\Helium",
           "C:\\ProgramData\\Packages\\Microsoft.YourPhone_8wekyb3d8bbwe\\S-1-5-21-1551970388-401600794-1189712708-1001\\SystemAppData\\Helium",
           "C:\\ProgramData\\Templates", "C:\\ProgramData\\「开始」菜单", "C:\\ProgramData\\桌面",
           "C:\\System Volume Information",
           "C:\\Users\\All Users", "C:\\Users\\Default", "C:\\Users\\Default User", "C:\\Users\\LENOVO\\AppData\\Local",
           "C:\\Users\\LENOVO\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\程序"
           "C:\\Users\\LENOVO\\Application Data"]  # 部分非法访问内容


def scaner_file(url):
    """

    遍历url路径下的所有文件

    :param url: 类型str, 需要搜索的路径
    """
    if url in mission:
        return 0
    else:
        file = listdir(url)
        chdir(url)
        for f in file:
            real_url = path.join(url, f)  # 拼接字符串:路径url和文件或文件夹名称
            if path.isfile(real_url):  # 如果路径为文件
                try:
                    if (not f.startswith("~")) and (not f.startswith("$")):  # 如果不是临时文件
                        listdir1.append([real_url, size(path.getsize(f)) + "(" + str(path.getsize(f)) + "字节" + ")",
                                         size(int(ceil(path.getsize(f) / 4096)) * 4096),
                                         path.getsize(f)])  # 在列表中加入这个文件的信息[路径,文件大小,文件占用空间,字节数(便于以后判断)]
                except FileNotFoundError:  # 如果没有找到文件
                    pass  # 不做任何操作
            elif path.isdir(real_url):
                # 如果是目录,则是递归调用自定义函数 scaner_file (url)多次
                if (not f.startswith("~")) and (not f.startswith("$")):  # 不是临时文件
                    scaner_file(real_url)  # 递归调用自己


if __name__ == "__main__":
    scaner_file(input("请输入路径:"))  # 输入路径并进行递归
    listdir1.sort(key=lambda obj: obj[3])  # 给listdir1排序,使用列表中的第4项,也就是字节数作为key
    for item in listdir1:  # 遍历列表
        print("-" * 50)  # 绘制分隔符
        for it in item:  # 遍历对象中的每一个元素
            print(it)  # 输出

谢谢大家浏览,人家写文章不容易,点个赞吧! 

————————————————
版权声明:本文参考CSDN博主「苦荞米」的原创文章,遵循CC 4.0 BY-SA版权协议,转载附上原文出处链接及本声明。
原文链接:C# 获取文件占用空间 (绝对准确)_苦荞米的博客-CSDN博客_c# 获取文件大小

你可能感兴趣的:(os,python)