繁体   English   中英

为什么 float() 不“解开”字符串格式的列表元素?

[英]Why does float() not "unstring" a string formatted list element?

我需要将作为字典一部分的逗号分隔字符串解析为值。 我收到的数据最初是一个(巨大的)JSON 格式的字符串,我正在用json.loads()将它加载到字典中。

从字符串中拆分出来的一些值将始终是浮点数,我只想对它们进行 float(),而其他值可以是字符串、null 或空值,需要单独处理(不是本问题的主题)。

奇怪的是,在拆分字符串之后,生成的列表似乎包含一些非 float()-able 版本的字符串。

考虑这个小的 python3 示例代码

# construct the sample dict
var = {}
var['abc'] = '"123.456","zzz"'

# JSONify it
var_json = json.dumps(var)

print("var_json: %s" % json.loads(var_json))

# var_json now exemplifies the input data
# deJSONify it:
data_in = json.loads(var_json)

a = data_in['abc'].split(",")
print(a[0])
print("this works:", float("123.456"))
print("this borks:", float(a[0]))

这导致以下 output:

var_json: {'abc': '"123.456","456"'}
"123.456"
this works: 123.456
Traceback (most recent call last):
  File "./test.py", line 26, in <module>
    print("this borks:", float(a[0]))
ValueError: could not convert string to float: '"123.456"'

所以:显然,对于 python,拆分产生的列表中的值是一个字符串(在输出中用双引号引起来)。 但是在那个字符串上使用float()是行不通的。

更改最后一行以手动替换引号有效:

print(float(a[0].replace("\"", "")))

所以看起来a[0]实际上是一个包含双引号的字符串。

即使没有 json.dumps/loads 往返,也会发生同样的错误,例如直接从字典访问拆分列表:

print("This also borks: ", float(var['abc'].split(",")[0]))

为什么 float() 不“解开”字符串和有效的浮点数转换输入? 如何避免 that.replace() 调用?

仅仅用逗号分隔是不够的; 您还需要从字符串的内容中删除文字引号。

引号不是数字。 因此,包含引号作为其中数据一部分的字符串不是仅包含数字的字符串。 正如 Python 字符串'a123a'无法解析为数字一样, '"123"'也不能:第二个示例中的"与第a一样不合适。

例如,您可以使用:

float(a[0].replace('"', ''))

只要您的 JSON 文档封装了 CSV 数据,您可以使用 Python csv模块以删除这些引号的方式解析它:

data_in = {'abc': '"123.456","zzz"'}
a = csv.reader([data_in['abc']]).__next__()
print("this now works:", float(a[0]))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM