【问题标题】:os.path.getsize Returns Incorrect Value?os.path.getsize 返回不正确的值?
【发布时间】:2012-05-11 09:12:11
【问题描述】:
def size_of_dir(dirname):
    print("Size of directory: ")
    print(os.path.getsize(dirname))

是有问题的代码。 dirname 是一个包含 130 个大约 1kb 文件的目录。当我调用这个函数时,它返回4624,它不是目录的大小......这是为什么呢?

【问题讨论】:

  • 乔,在我看来,您好像有两个完全回答了您的问题的答案。你应该接受其中一个,或者如果你认为有一些重要的事情他们没有处理,你应该澄清你的问题。
  • 4624(在我的情况下为 4096)是文件夹大小。我相信这是文件系统的最小分配。内容总和为:sum(os.path.getsize('/'.join([root,file])) for root, _, files in os.walk(dirname) for file in files if file)

标签: python file directory size


【解决方案1】:

第一个答案给我带来了这个:

>>> sum([os.path.getsize(f) for f in os.listdir('.') if os.path.isfile(f)])
1708

这对我来说也不正确 :((我确实检查了我的 cwd)

下面的代码给我带来了更接近的结果

total_size = 0
for folders, subfolders, files in os.walk(dirname):
    for file in files:
        total_size += os.path.getsize(os.path.join(folders, file))
print(total_size)

【讨论】:

    【解决方案2】:

    这个值 (4624B) 表示 描述该目录的 文件 的大小。目录被描述为 inode (http://en.wikipedia.org/wiki/Inode),其中包含有关其包含的文件和目录的信息。

    要获取该路径内的文件/子目录的数量,请使用:

    len(os.listdir(dirname))
    

    要获取数据总量,您可以使用代码in this question,即(如@linker 发布的)

     sum([os.path.getsize(f) for f in os.listdir('.') if os.path.isfile(f)]).
    

    【讨论】:

    • 你第一次写了os.path.listdir,但可能意味着os.listdir(就像你第二次写的那样)..?
    • 请注意,如果目录包含子目录,则不会获取总数据量。它只能在平面目录层次结构上可靠地工作。
    • 这并不适用于所有类型的文件系统。 os.path.getsize 返回stat 结果中st_size 字段的值,即means different things on different file systems;例如,显然它是 ZFS 文件系统上的目录条目数。
    【解决方案3】:
    import os
    
    def create_python_script(filename):
        comments = "# Start of a new Python Program"
        #filesize = 0
        with open(filename, 'w') as new_file:
            new_file.write(comments)
            cwd=os.getcwd()
            fpath = os.path.abspath(filename)
            filesize=os.path.getsize(fpath)
        return(filesize)
    
    print(create_python_script('newprogram.py'))
    

    它应该是 31 个字节,但结果却是“0”

    【讨论】:

    • 您好,当您回答一个问题时,很高兴能说清楚。所以一些代码格式(见editing-help)会很好,还有一些解释;此外,已经有一些很好的答案,所以理想情况下,你的答案应该提供一个有用的选择。在这个阶段,它似乎没有以上任何一个。
    【解决方案4】:

    使用os.path.getsize() 只会让您了解目录的大小,不会了解其内容。因此,如果您在任何目录上调用getsize(),您将始终获得相同的大小,因为它们都以相同的方式表示。相反,如果你在一个文件上调用它,它会返回实际的文件大小。

    如果您想要内容,则需要递归执行,如下所示:

    sum([os.path.getsize(f) for f in os.listdir('.') if os.path.isfile(f)])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-09
      • 2021-10-26
      • 2015-10-13
      • 2014-12-06
      • 2021-02-01
      • 2017-08-21
      • 2021-10-27
      • 2021-02-10
      相关资源
      最近更新 更多