【Python】数据类型的转换 eval和ast.literal_eval


eval 用来执行一个字符串表达式,并返回表达式的值

  • eval() 把数据还原成它本身或者是能够转化成的数据类型,(即:可以实现从tuple 元组,list列表,dict字典型的 str字符串到元组,列表,字典的转换
    • string <==> dict
      str_dict= '{"name":"zhangsan"}'
      chg_dict = eval(str_dict)
      
      print(str_dict, chg_dict)
      print(type(str_dict), type(chg_dict))
      {"name":"zhangsan"} {'name': 'zhangsan'}
      <class 'str'> <class 'dict'>
      
      进程已结束,退出代码0
      执行结果

       

    • string <==> tuple
      str_tuple = '(4,5,6)'
      chg_tuple = eval(str_tuple)
      
      print(str_tuple, chg_tuple)
      print(type(str_tuple), type(chg_tuple))
      (4,5,6) (4, 5, 6)
      <class 'str'> <class 'tuple'>
      
      进程已结束,退出代码0
      执行结果

       

    • string  <==> list
      str_list = '[1,2,2]'
      chg_list = eval(str_list)
      
      print(str_list,chg_list)
      print(type(str_list),type(chg_list))
      [1,2,2] [1, 2, 2]
      <class 'str'> <class 'list'>
      
      进程已结束,退出代码0
      执行结果

       

  •  eval()  还可以对字符串型的输入直接计算
    • input
      a = input("Plase input a value string:")
      b = input("Plase input a value string:")
      normal_value = a + b
      eval_value = eval(a) + eval(b)
      print("正常value输出:",normal_value)
      print("使用eval输出:",eval_value)
      Plase input a value string:1
      Plase input a value string:8
      正常value输出: 18
      使用eval输出: 9
      
      进程已结束,退出代码0
      执行结果

       

    •  对所有能解析的字符串都做处理(比如读取文件,路径,目录, 删除文件等)
      read_path = "__import__('os').getcwd()"
      # read_dir = "__import__('os').system('dir')"
      print("正常输出:",read_path)
      print("转换输出:",eval(read_path))
      # print(eval(read_dir))
      正常输出: __import__('os').getcwd()
      转换输出: Z:\Python\xxx\common
      
      进程已结束,退出代码0
      执行结果

       

    • 通过变量内容作为函数名调用 eval函数

      # 赋值函数名称
      a = "b"
      # 定义函数
      def b():
          print(123)
      # 通过变量调用函数
      eval(a)()

       

      # 赋值函数名称
      a = "b()"
      # 定义函数
      def b():
          print(123)
      # 通过变量调用函数
      eval(a)

 

ast.literal_eval()

  • ast模块就是帮助Python应用来处理抽象的语法解析的

  • literal_eval() 会判断需要计算的内容计算后是不是合法的python类型,相较于eval()较安全 
    • 示例1:
      import ast
      
      read_path = "__import__('os').getcwd()"
      # read_dir = "__import__('os').system('dir')"
      print("正常输出:",read_path)
      print("eval转换输出:",eval(read_path))
      try:
          print("asr转换输出:",ast.literal_eval(read_path))
      except Exception as e:
          print("Exception 原因:",e)
      
      normal_value = "(1,2,3)"
      print("asr转换输出:",ast.literal_eval(normal_value))
      正常输出: __import__('os').getcwd()
      eval转换输出: Z:\Python\xxxx\common
      Exception 原因: malformed node or string: <_ast.Call object at 0x00C70298>
      asr转换输出: (1, 2, 3)
      
      进程已结束,退出代码0
      执行结果
    •  示例2:
      ast_tuple = "(1,2,3)"
      print("ast转换输出:",ast.literal_eval(ast_tuple))
      ast_list = "[1,2,3]"
      print("ast转换输出:",ast.literal_eval(ast_list))
      ast_dict = "{'name':'zhangsan'}"
      print("ast转换输出:",ast.literal_eval(ast_dict))
      
      # 将dict 字段的'替换为"
      rep = ast_dict.replace("'",'"')
      
      print("reolace 替换",rep)
      print("ast转换输出:",ast.literal_eval(rep))
      ast转换输出: (1, 2, 3)
      ast转换输出: [1, 2, 3]
      ast转换输出: {'name': 'zhangsan'}
      reolace 替换 {"name":"zhangsan"}
      ast转换输出: {'name': 'zhangsan'}
      
      进程已结束,退出代码0
      执行结果

       

    


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM