python函数——eval()、os.path、shutil 、request.files.get、re.findall、replace

  • Post author:
  • Post category:python




一、eval()

eval() 函数用来执行一个字符串表达式,并返回表达式的值。

eval(expression[, globals[, locals]])

参数

os.path

expression – 表达式。

globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。

locals –变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

字符串与list、tuple、dict的转化

a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
b = eval(a)
b
Out[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
type(b)
Out[4]: list
a = "{1: 'a', 2: 'b'}"
b = eval(a)
b
Out[7]: {1: 'a', 2: 'b'}
type(b)
Out[8]: dict
a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
b = eval(a)
b
Out[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))

给个字符串给eval,eval给你一个表达式返回值

  1. 传递globals参数值为{“age”:1822}
eval("{'name':'linux','age':age}",{"age":1822})

输出结果:{‘name’: ‘linux’, ‘age’: 1822}

再加上locals变量

age=18
eval("{'name':'linux','age':age}",{"age":1822},locals())

输出

{'age': 18, 'name': 'linux'}


根据上面两个例子可以看到当locals参数为空,globals参数不为空时,查找globals参数中是否存在变量,并计算。

当两个参数都不为空时,先查找locals参数,再查找globals参数,locals参数中同名变量会覆盖globals中的变量。



二、危险之处

eval虽然方便,但是要注意安全性,可以将字符串转成表达式并执行,就可以利用执行系统命令,删除文件等操作。

假设用户恶意输入。比如

eval("__import__('os').system('ls /Users/chunming.liu/Downloads/')")

那么eval()之后,你会发现,当前文件夹文件都会展如今用户前面。这句其实相当于执行了

os.system('ls /Users/chunming.liu/Downloads/')

那么继续输入:

eval("__import__('os').system('cat /Users/chunming.liu/Downloads/tls_asimov_cert.pem')")

代码都给人看了。

再来一条删除命令,文件消失。比如

eval("__import__('os').system('rm /Users/chunming.liu/Downloads/车辆转发测试.png')")



三、 os.path.join

连接两个或更多的路径名组件

1.如果各组件名首字母不包含’/’,则函数会自动加上

2.第一个以”/”开头的参数开始拼接,之前的参数全部丢弃,当有多个时,从最后一个开始

3.如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾

print(“2:”,os.path.join(’/aaaa’,’/bbbb’,’/ccccc.txt’)) #不良写法习惯

2: /ccccc.txt

print(“22:”,os.path.join(’/aaaa/’,‘bbbb/’,‘ccccc.txt’)) #通常可以这样写

22: aaaa/bbb/ccccc.txt

print(“1:”,os.path.join(‘aaaa’,’/bbbb’,‘ccccc.txt’))

#以字符串中含有 / 的第一个开始拼接:

1: /bbbb/ccccc.txt


os.path.exists()


os.path模块主要用于文件的属性获取,exists是“存在”的意思,所以顾名思义,os.path.exists()就是判断括号里的文件是否存在的意思,括号内的可以是文件路径。

如果不存在,返回的则是FALSE

举例如下:

 Finalpath = os.path.join(CertificateRootPath,'c6',NfvoIp)
 if not os.path.exists(Finalpath):
 		os.mkdir(Finalpath)

之前网上查找os.path.isdir()和os.path.isfile()的使用;发现很多是错误的,主要原因是,传入的参数不是绝对路径。


os.listdir()方法,此方法返回一个列表,其中包含有指定路径下的目录和文件的名称

import os
dirct = '/home/vnfm/vnfm-develop/'
for i in os.listdir(dirct):
    print(i)


['vnfm', 'vnfm-env']


os.path.isdir()和os.path.isfile()需要传入的参数是绝对路径

,但是os.listdir()返回的只是一个某个路径下的文件和列表的名称.

常见错误:直接使用os.listdir()的返回值当做os.path.isdir()和os.path.isfile()的入参

正确用法:需要先使用python路径拼接os.path.join()函数,将os.listdir()返回的名称拼接成文件或目录的绝对路径再传入os.path.isdir()和os.path.isfile().

os.path.join()用法:

import os
dirct = '/home/vnfm/vnfm-develop/'
for i in os.listdir(dirct):
    fulldirct = os.path.join(dirct,i)
    print(fulldirct)
    
    
/home/vnfm/vnfm-develop/vnfm
/home/vnfm/vnfm-develop/vnfm-env


os.path.isdir()用于判断某一对象(需提供绝对路径)是否为目录

import os
dirct = '/home/vnfm/vnfm-develop/vnfm/'
for i in os.listdir(dirct):
    fulldirct = os.path.join(dirct, i)
    if os.path.isdir(fulldirct): 
        print(i)	
 
        
.git
documents
policy
vnfm
vnfd


os.path.isfile()用于判断某一对象(需提供绝对路径)是否为文件

import os
dirct = '/home/vnfm/vnfm-develop/vnfm/'
for i in os.listdir(dirct):
    fulldirct = os.path.join(dirct, i)
    if os.path.isfile(fulldirct): 
        print(i)
    
entrypoint.sh
upgrade_vnfm.sh      
如果该目录下有文件,打印出文件名        


os.path.abspath(path) 返回绝对路径


shutil.rmtree() 表示递归删除文件夹下的所有子文件夹和子文件



因此如果想删除E盘下某个文件夹,可以用

shutil.rmtree('E:\\myPython\\image-filter\\test', ignore_errors=True)

这样 test 文件夹内的所有文件(包括 test 本身)都会被删除,并且忽略错误。



四、 request.files.get

file_obj = request.files.get(‘file’) 的方式获取文件对象

返回值 file_obj 是一个文件对象,但是我们平常在使用时通常是在open() 函数中指定打开方式的,可是这里并不知道这个文件对象中的数据是何种编码方式,因此就会出现中文乱码的问题

解决方法:

先从文件对象中将内容读出,然后再按照我们想要的格式解码(通常 utf-8)。

 file_obj = request.files.get('file')
 file_content = file_obj.read()
 file_content = file_content.decode("utf-8")
 print('答案内容为:', file_content)

request中的files属性,,,记录请求上传的文件

已上传的文件存储在内存或是文件系统中一个临时的位置。你可以通过请求对象的 files 属性访问它们。

每个上传的文件都会存储在这个字典里。它表现近乎为一个标准的 Python file 对象,

但它还有一个

save() 方法,这个方法允许你把文件保存到服务器的文件系统上

例如:

if request.files.get('ca_cert'):
     request_data = request.files.get('ca_cert')
     request_data.save(Finalpath+'/ca.cert')

例子2:

from flask import Flask, request
 
app = Flask(__name__)
 
'''因为是文件,所以只能是POST方式'''
@app.route("/upload", methods=["POST"])
def upload():
    """接受前端传送来的文件"""
    file_obj = request.files.get("pic")
    if file_obj is None:
        # 表示没有发送文件
        return "未上传文件"
 
    '''
        将文件保存到本地(即当前目录)
        直接使用上传的文件对象保存
    '''
    file_obj.save('pic.jpg')  # 和前端上传的文件类型要相同
    return "上传成功"
 
    # 将文件保存到本地(即当前目录) 普通的保存方法
    # with open("./pic.jpg",'wb') as f:
    #     data = file_obj.read()
    #     f.write(data)
    #     return "上传成功"
 
if __name__ == '__main__':
    app.run(debug=True)

request方法扩展请点击

这个链接

关于make_response响应、redirect跳转,请点击

Flask中request请求、make_response响应、redirect跳转



五、re.findall(pattern, text)(关键词:python/正则表达式/re)

findall(pattern, text)函数会返回输入中与模式匹配而不重叠的所有子串

import re
text = 'abbaaabbbbaaaaa'
pattern = 'ab'

for match in re.findall(pattern, text):
        print 'Found "%s"' % match

输出:

Found “ab”

Found “ab”

import re
kk = re.compile(r'\d+')
kk.findall('one1two2three3four4')
#[1,2,3,4]
 
#注意此处findall()的用法,可传两个参数;
kk = re.compile(r'\d+')
re.findall(kk,"one123")
#[1,2,3]

从compile()函数的定义中,可以看出返回的是一个匹配对象,它单独使用就没有任何意义,需要和findall(), search(), match()搭配使用。


compile()与findall()一起使用,返回一个列表。


compile()与match()一起使用,可返回一个class、str、tuple。但是一定需要注意match(),从位置0开始匹配,匹配不到会返回None,返回None的时候就没有span/group属性了,并且与group使用,返回一个单词‘Hello’后匹配就会结束。

compile()与search()搭配使用, 返回的类型与match()差不多, 但是不同的是search(), 可以不从位置0开始匹配。但是匹配一个单词之后,匹配和match()一样,匹配就会结束。

\s表示空格

\w表示任何字符,包括字母数字下划线

_就表示下划线

\s – 匹配任何不可见字符,包括空格、制表符、换页符等等

\S – 匹配任何可见字符 通常[/s/S] – 可匹配任意字符

[\s\S]*? – 匹配懒惰模式的任意字符

详情:

查看相关区别

正则表达式有括号时 可能遇到得坑 ,请点击

Python 正则re模块之findall()详解



六、替换函数replace()

Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。

str.replace(old, new[, max])

返回字符串中的 old(旧字符串) 替换成 new(新字符串)后生成的新字符串,如果指定第三个参数max,则替换不超过 max 次

str = "this is string example....wow!!! this is really string";
print str.replace("is", "was");
print str.replace("is", "was", 3);

if '[' in VimIp:
     VimIp = VimIp.replace('[','').replace(']','') 



七、



版权声明:本文为xili2532原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。