【问题标题】:How do I convert a string response size to MB in Python?如何在 Python 中将字符串响应大小转换为 MB?
【发布时间】:2022-11-01 22:00:44
【问题描述】:

我正在做一些抓取项目,我正在抓取一些数据文件信息。问题是响应是一个有时以 kB、MB、GB 等为单位的字符串。我需要将得到的响应转换为 MB 并删除文本部分,例如。 290.5kB 应该在最后返回 0.29 而没有 MB。 刮掉的部分如下所示: Format: MapInfo MIF, (290.5 kB) 这是我的代码sn-p:

f_file_size = file_format.split('Format: ')[1].split(',')[1].strip(' ()')


output_dict['data_files'].append({'file_size': f_file_size})

哪个输出:

"data_files" : [{
    "file_size": "290.5 kB"
}]

您的帮助将不胜感激

【问题讨论】:

  • 这绝对不是输出,290.5kB 周围会有引号(除非你有你省略的自定义打印代码)。无论如何,您尝试过什么?这不是内置工具,您将需要编写自定义解析器,如果您不努力,“请为我编写代码”不是一个好问题。如果您尝试并失败,并提供您尝试的minimal reproducible example,我们将很乐意帮助您修复它。
  • 编写一个函数来解析返回的字符串并将它们转换为数字。然后,您可以稍后按您喜欢的方式格式化该数字。
  • 谢谢你。我手写了代码。我尝试为每个 kB、GB 和 MB 编写 if else 语句,但我不能除以字符串。剥离文本部分的代码(MB、kB 等)将使您很难知道要除以 @ShadowRanger 的内容

标签: python


【解决方案1】:

我们可以在这里使用re.sub 和回调函数:

def repl(m):
    val = float(m.group(1))
    unit = m.group(2)

    if unit == 'kB':
        return str(val / 1000)
    elif unit == 'MB':
        return str(val)
    elif unit == 'GB':
        return str(val * 1000)
    else:
        return str(val)  # assume MB as the default

inp = "Format: MapInfo MIF, (290.5 kB)"
output = re.sub(r'(d+(?:.d+)?)s*(wB)', repl, inp)
print(output)  # Format: MapInfo MIF, (0.2905)

这里的想法是捕获一个数字,可能是浮点数,后跟一个字节单位,然后将数量和单位传递给回调函数。回调仅返回缩放到 MB 的数量。

其他单位可以很容易地添加到回调函数中,并且可以根据需要调整正则表达式模式。这里的一个优化可能是创建一个将单位映射到转换因子的字典,例如

units = {}
units["kB"] = 1000
units["MB"] = 1
units["GB"] = 0.001

然后我们可以简单地查找转换因子,而不是使用大的 if else 构造。

【讨论】:

    【解决方案2】:

    您可以通过float(f_file_size[:-2]) 进行如下操作

    f_file_size = file_format.split('Format: ')[1].split(',')[1].strip(' ()')
    
    
    output_dict['data_files'].append({'file_size': float(f_file_size[:-2])})
    

    【讨论】:

    • 我确定这只是去除了“kB”或“MB”部分,但没有内置任何转换
    猜你喜欢
    • 2021-05-29
    • 2021-06-11
    • 2020-06-20
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多