Python 将人类可读的文件大小解析为字节

Python 将人类可读的文件大小解析为字节,python,Python,我想把所有这些字符串转换成字节。到目前为止,我得出了以下结论: example_strings = ["10.43 KB", "11 GB", "343.1 MB"] 但我不喜欢它,而且我认为它不起作用。我只能找到做相反事情的模块。这里有一个稍微漂亮一点的版本。可能没有用于此的模块,只需内联定义函数即可。它非常小而且可读 def parseSize(size): if size.endswith(" B")

我想把所有这些字符串转换成字节。到目前为止,我得出了以下结论:

example_strings = ["10.43 KB", "11 GB", "343.1 MB"]

但我不喜欢它,而且我认为它不起作用。我只能找到做相反事情的模块。

这里有一个稍微漂亮一点的版本。可能没有用于此的模块,只需内联定义函数即可。它非常小而且可读

def parseSize(size):
    if size.endswith(" B"):
        size = int(size.rstrip(" B"))
    elif size.endswith(" KB"):
        size = float(size.rstrip(" KB")) * 1000
    elif size.endswith(" MB"):
        size = float(size.rstrip(" MB")) * 1000000
    elif size.endswith(" GB"):
        size = float(size.rstrip(" GB")) * 10000000000
    elif size.endswith(" TB"):
        size = float(size.rstrip(" TB")) * 10000000000000
    return int(size)

代码将搜索包含字符串的度量单位。一旦发现。使用另一个正则表达式,提取数字。一旦做了这两件事。将值计算为字节。如果未指定该值,它将尝试将其视为字节,但如果无法进行转换,则函数将返回0

units = {"B": 1, "KB": 10**3, "MB": 10**6, "GB": 10**9, "TB": 10**12}

def parse_size(size):
    number, unit = [string.strip() for string in size.split()]
    return int(float(number)*units[unit])


example_strings = ["10.43 KB", "11 GB", "343.1 MB"]

for example_string in example_strings:
    print(parse_size(example_string))

10430
11000000000
343100000
我喜欢和谷歌上的其他东西相比,但是它

  • 数字和单位之间需要的空格
  • 没有处理小写单位
  • 假设一个
    kb
    是1000而不是1024,诸如此类(多年前试图指出这一点,这是值得称赞的。也许我们的假设太老套了,但我认为大多数软件也无法跟上新的假设。)
因此,我将其调整为:

def calculate(data):

    convertion={"G":1073741824,"M":1048576,"K":1024,"B":1}
    result=re.findall(r'G|M|K|B',data,re.IGNORECASE)
    if len(result)>=1:
        number=re.findall(r'[-+]?\d*\.\d+|\d+', data)
        number=float(number[0])
        return int(number*convertion[result[0].upper()])
    else:
      number=re.findall(r'[-+]?\d*\.\d+|\d+', data)
      if len(number)>=1:
        number=float(number[0])
        return int(number*convertion["B"])
      else:
          return 0
我们可以通过检查输出来验证:

import re

# based on https://stackoverflow.com/a/42865957/2002471
units = {"B": 1, "KB": 2**10, "MB": 2**20, "GB": 2**30, "TB": 2**40}

def parse_size(size):
    size = size.upper()
    #print("parsing size ", size)
    if not re.match(r' ', size):
        size = re.sub(r'([KMGT]?B)', r' \1', size)
    number, unit = [string.strip() for string in size.split()]
    return int(float(number)*units[unit])

example_strings = ["1024b", "10.43 KB", "11 GB", "343.1 MB", "10.43KB", "11GB", "343.1MB", "10.43 kb", "11 gb", "343.1 mb", "10.43kb", "11gb", "343.1mb"]

for example_string in example_strings:
        print(example_string, parse_size(example_string))

为了回答老年退休金计划的问题,似乎有一个模块用于此:

pip安装人性化

那么

>>导入人性化
>>>用户输入=原始输入(“输入可读文件大小:”)
输入可读文件大小:16G
>>>num\u bytes=humanfriendly.parse\u size(用户输入)
>>>打印字节数
16000000000
>>>打印“您输入:”,人性化。格式大小(num字节)
您输入:16 GB
>>>打印“您输入的:”,人性化。格式大小(num字节,二进制=True)
您输入:14.9 GiB
根据答案,仅使用正则表达式解析大小并接受整数大小

UNITS={None:1,B:1,KB:2**10,MB:2**20,GB:2**30,TB:2**40}
def解析_人_大小(大小):
"""
>>>示例=[12345,“123214”,“1024b”,“10.43KB”,“11GB”,“343.1MB”,“10.43KB”,“11GB”,“343.1MB”,“10.43KB”]
>>>对于示例中的s:
打印('[',s']',解析人的大小)
"""
如果isinstance(大小,整数):
返回大小
m=re.match(r'^(\d+(?:\。\d+))\s*([KMGT]?B)?$”,size.upper()
如果m:
数量,单位=m.组()
返回整数(浮点(数字)*单位[单位])
raise VALUETERROR(“无效的人体尺寸”)

当你说字节时,它可能是重复的,只是编码或转换成二进制(01010..)?显然他们想要字节数作为一个整数。为什么“你不认为它有效?”有一个模块值得评估:奇怪的是,不要在这里和问题本身中使用
1024
作为乘法器。@mlissner不是真的,因为K表示1000,而KB从技术上讲是1000字节(其他前缀也是如此)。1024在实践中经常被使用,但从技术上讲,这将是一个KiB,一个Kibibyte。尽管如此,如果任何系统说某个东西是5kb,我会认为它意味着kibibyte。不管怎样,希望这场讨论有一天能对某些人有所帮助。这就是我真正想要的!我主要是想以一种有意义的方式对这些该死的东西进行排序,这是有效的:)你能编辑这个答案并解释代码的作用吗。。?
$ python humansize.py 
('1024b', 1024)
('10.43 KB', 10680)
('11 GB', 11811160064)
('343.1 MB', 359766425)
('10.43KB', 10680)
('11GB', 11811160064)
('343.1MB', 359766425)
('10.43 kb', 10680)
('11 gb', 11811160064)
('343.1 mb', 359766425)
('10.43kb', 10680)
('11gb', 11811160064)
('343.1mb', 359766425)