浅谈Python处理json字符串为什么不建议使用eval()

目录
  • 一、前言
  • 二、Json.loads与eval 性能对比
    • 1. eval
    • 2. json.loads

一、前言

最近发现一些小伙伴使用eval来处理json,而且为了能够将json成功转为字典而不报错,还写了如下的赋值操作 (因为json中空为null,假为false,真为true与Python的表达不一样,如果不进行下面代码的赋值,用eval转换就会报错):

null=None
false=False
true=True

其实Python的标准库中有处理json的库,就叫json,比如要把json字符串转为字典的话只需要使用json.loads这个方法就可以了;另外,eval处理json的性能也是远远比不上json库的。

二、Json.loads与eval 性能对比

现在我们创建一个长度为100万的json字符串数据:

test_data = json.dumps({str(i): i for i in range(1000000)})

然后分别通过eval,json.loads来处理,他们的时间对比:

1. eval

执行时间为: 0:00:03.730528

2. json.loads

执行时间为: 0:00:00.466475

执行时间相差了8倍多!

另外在自己的项目中,刚好有需求涉及到100KB+的json字符串转换,它们的耗时对比如下:

如果没有并发执行的情况下,使用json.loads或eval来转换花费的时间差距不是能够感知出来的,但涉及并发执行那就会变得很明显。所以快把你代码中处理json的eval改为json.loads吧!

如果做请求使用的是requests库的话,可以直接使用它的json()方法,例如:

res=requests.get(url='http://qqlykm.cn/api/t/url.php?url=quniao.blog.csdn.net')
res_dict=res.json()

查看源码发现它也是调用python标准库中的json.loads方法,只是这样可以少写一点代码。

到此这篇关于浅谈Python处理json字符串为什么不建议使用eval()的文章就介绍到这了,更多相关Python处理json字符串内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python之eval()函数危险性浅析

    一般来说Python的eval()函数可以把字符串"123"变成数字类型的123,但是PP3E上说它很危险,还可以执行其他命令! 对此进行一些试验.果然,如果python写的cgi程序中如果使用eval()而非int()来转换诸如年龄这样的输入框中的内容时是非常危险的.不仅可以看见列出系统的全部文件,还可以执行删除文件,察看文件源代码等危险操作! 试着写了个程序,想把本地的脚本文件同过这样的形式一行一行的写到服务器的某个文件里,可最后失败在无法输入换行符"/n",在

  • 深度辨析Python的eval()与exec()的方法

    Python 提供了很多内置的工具函数(Built-in Functions),在最新的 Python 3 官方文档中,它列出了 69 个. 大部分函数是我们经常使用的,例如 print().open() 与 dir(),而有一些函数虽然不常用,但它们在某些场景下,却能发挥出不一般的作用.内置函数们能够被"提拔"出来,这就意味着它们皆有独到之处,有用武之地. 因此,掌握内置函数的用法,就成了我们应该点亮的技能. 在<Python进阶:如何将字符串常量转为变量?>这篇文章中,

  • 解析Python中的eval()、exec()及其相关函数

    刚好前些天有人提到eval()与exec()这两个函数,所以就翻了下Python的文档.这里就来简单说一下这两个函数以及与它们相关的几个函数,如globals().locals()和compile(): 1. eval函数 函数的作用: 计算指定表达式的值.也就是说它要执行的Python代码只能是单个运算表达式(注意eval不支持任意形式的赋值操作),而不能是复杂的代码逻辑,这一点和lambda表达式比较相似. 函数定义: eval(expression, globals=None, local

  • python处理json字符串(使用json.loads而不是eval())

    eval 跟json.loads 是不一样的函数,是有实现不一样功能的地方,但是在某些地方它们两个函数的功能是一样的,在这个时候如果对执行效率有一定要求的话,建议不要用eval,改用json.loads会有惊喜哦. 一.eval eval() 函数用来执行一个字符串表达式,并返回表达式的值. 二.json.loads json.loads 用于解码 JSON 数据.该函数返回 Python 字段的数据类型. json.loads与eval都能将json字符串转成python中的对象,但在实际工作

  • python eval()函数使用详情

    目录 一.eval()函数是什么? 二.eval()函数语法解析 三.eval()函数应用举例 3.1 eval()基本应用举例 3.2 eval()危害举例 3.3 ast.literal_eval()替代eval()实现数据类型转换 一.eval()函数是什么? Python的一个内置函数: 返回传入字符串的表达式结果(官方) 二.eval()函数语法解析 三.eval()函数应用举例 3.1 eval()基本应用举例 上述例子中,展示了eval()的3个应用: 把字符串转化为代码表达式求结

  • 浅谈Python处理json字符串为什么不建议使用eval()

    目录 一.前言 二.Json.loads与eval 性能对比 1. eval 2. json.loads 一.前言 最近发现一些小伙伴使用eval来处理json,而且为了能够将json成功转为字典而不报错,还写了如下的赋值操作 (因为json中空为null,假为false,真为true与Python的表达不一样,如果不进行下面代码的赋值,用eval转换就会报错): null=None false=False true=True 其实Python的标准库中有处理json的库,就叫json,比如要把

  • 浅谈python处理json和redis hash的坑

    1.使用MySQLdb读取出来的数据是unicode字符串,如果要写入redis的hash中会变成 "{u'eth0_outFlow': 2.5, u'eth1_inFlow': 3.44}" 无法使用json.loads,需要提前将unicode转成str: str(eth0_outFlow) 2.单引号包围的key不是规范的json格式 "{'eth0_outFlow': 2.5, 'eth1_inFlow': 3.44}" 需要转成规范的格式才能使用json.

  • 浅谈python中str字符串和unicode对象字符串的拼接问题

    str字符串 s = '中文' # s: <type 'str'> s是个str对象,中文字符串.存储方式是字节码.字节码是怎么存的: 如果这行代码在python解释器中输入&运行,那么s的格式就是解释器的编码格式: 如果这行代码是在源码文件中写入.保存然后执行,那么解释器载入代码时就将s初始化为文件指定编码(比如py文件开头那行的utf-8): unicode对象字符串 unicode是一种编码标准,具体的实现可能是utf-8,utf-16,gbk等等,这就是中文字符串和unicod

  • 浅谈Python中的字符串

    可能大多数人在学习C语言的时候,最先接触的数据类型就是字符串,因为大多教程都是以"Hello world"这个程序作为入门程序,这个程序中要打印的"Hello world"就是字符串.如果你做过自然语言处理方面的研究,并且用Python去做过相关实验,你肯定会体会到Python在字符串处理方面相对于其他语言的明显优势之处.今天我们来了解一下Python中的字符串,看看它的用法. 一.Python中如何声明字符串 在Python中声明一个字符串通常有三种方法:在它的两

  • 浅谈python中对于json写入txt文件的编码问题

    最近一直在研究python+selenium+beautifulsoup的爬虫,但是存入数据库还有写入txt文件里面的时候一直都是unicode编码的格式. 接下来就是各种翻阅文档,查找谷歌和度娘,但是都没有具体的说明是什么问题. 结果根据自己的代码发现,原来是一句代码写到后面去了. name = json.dumps('中国你好', ensure_ascii=False) #重点就是这一句代码 date = time.strftime('%Y-%m-%d', time.localtime(ti

  • 浅谈Python中的异常和JSON读写数据的实现

    异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try ... catch ... finally来处理异常,在Python中通过try ... except ... else来处理异常 一.以ZeroDivisionError为例,处理分母为0的除法异常 def division(numerator,denominator): result=numerator/denominator return result ret1=division(1,5) prin

  • 浅谈python中列表、字符串、字典的常用操作

    列表操作如此下: a = ["haha","xixi","baba"] 增:a.append[gg] a.insert[1,gg] 在下标为1的地方,新增 gg 删:a.remove(haha) 删除列表中从左往右,第一个匹配到的 haha del a.[0] 删除下标为0 对应的值 a.pop(0) 括号里不写内容,默认删除最后一个,写了,就删除对应下标的内容 改:a.[0] = "gg" 查:a[0] a.index(&q

  • 浅谈Python 字符串格式化输出(format/printf)

    Python 字符串格式化使用 "字符 %格式1 %格式2 字符"%(变量1,变量2),%格式表示接受变量的类型.简单的使用例子如下: # 例:字符串格式化 Name = '17jo'   print 'www.%s.com'%Name   >> www.17jo.com Name = '17jo' Zone = 'com' print 'www.%s.%s'%(Name,Zone) >> www.17jo.com 字符串格式化时百分号后面有不同的格式符号,代表

  • 浅谈python字符串方法的简单使用

    学习python字符串方法的使用,对书中列举的每种方法都做一个试用,将结果记录,方便以后查询. (1) s.capitalize() ;功能:返回字符串的的副本,并将首字母大写.使用如下: >>> s = 'wwwwww' >>> scap = s.capitalize() >>> scap 'Wwwwww' (2)s.center(width,char); 功能:返回将s字符串放在中间的一个长度为width的字符串,默认其他部分用空格填充,否则使用c

  • 浅谈python下含中文字符串正则表达式的编码问题

    前言 Python文件默认的编码格式是ascii ,无法识别汉字,因为ascii码中没有中文. 所以py文件中要写中文字符时,一般在开头加 # -*- coding: utf-8 -*- 或者 #coding=utf-8. 这是指定一种编码格式,意味着用该编码存储中文字符(也可以是gbk.gb2312等). 关于测试的几点注意 -------------------------------------------- 注1:代码中有中文,就要在头部指定编码方式,如果用编辑器写代码,还要注意IDE的

随机推荐