[英]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.