Python语法知识点二

标签: Python 分类: Python 创建时间:2020-01-27 11:15:23 更新时间:2023-10-20 11:23:26

1.python文件操作

(1) 清空文件

1
2
3
4
5
6
7
## 覆盖文件内容
def modify_text():
with open('test.txt', "r+",encoding="utf-8") as f:
read_data = f.read()
f.seek(0)
f.truncate() #清空文件
f.write(read_data.replace('apple', 'android'))

(2) 复制文件

1
2
3
4
5
## 引入shuil模块
import shutil

## 复制文件
shuil.copy(src,dist)

2.执行shell命令

3.测试网络延迟

(一) 为了测试哪个节点更好用,所以我想到了使用python进行测试网络延迟的方式。在python2中,有现成的例子,很多的参考文章都是引用的同一段代码,主要是使用了ping模块,用了ping.quiet_ping函数,但是在python3中似乎没有了这个模块,就像参考文章1,2,3。

(二) 辗转我想到了使用ping命令,ping命令的返回格式如下:

搭配python的subprocess模块,我只需要获取最后一行,然后使用正则表达式提取其中的信息就好了。其实头疼的就是不会写正则表达式。re是Python中用于正则表达式相关处理的类,这四个方法都是用于匹配字符串的,具体区别如下:
(1) match
匹配string 开头,成功返回Match object, 失败返回None,只匹配一个。

(2) search
在string中进行搜索,成功返回Match object, 失败返回None, 只匹配一个。

(3) findall
在string中查找所有 匹配成功的组, 即用括号括起来的部分。返回list对象,每个list item是由每个匹配的所有组组成的list。

(4) finditer
在string中查找所有 匹配成功的字符串, 返回iterator,每个item是一个Match object。

最后的测量网络延迟的python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import subprocess
def pingIp(ipaddress):
try:
out_bytes = subprocess.check_output(['ping',ipaddress,'-c','10'])
out_text = out_bytes.decode('utf-8')
out_array=out_text.split('\n')
## 去掉空格
out_array=[x for x in out_array if x!='']
print(out_array)
## 去最后两个
packetStr=out_array[-2]
rttStr=out_array[-1]

## 获取丢包率
searchObj = re.search( r'(100|[1-9]?\d(\.\d\d?\d?)?)%', packetStr, re.M|re.I)

print("丢包率:"+searchObj.group())

## 获取延迟
pattern = re.compile(r'(-?\d+\.\d+)', re.I)
m = pattern.findall(rttStr)
# searchOb=re.search(r'\[(-?\d+\.\d+)/]+\',rttStr,re.M|re.I)
print('延迟min:'+m[0])
print('延迟avg:'+m[1])
print('延迟max:'+m[2])
print('延迟mdev'+m[3])

except IndexError:
print('pingIp')

(三) 还有一个问题就是,如何判断网络是否联通。我们知道,如果ping一个ip地址,如果不通的话,会长时间没有响应,而不是像上面一样,会有返回值。
仔细查看了ping命令的参数,ping命令还有一个特别的参数就是:-W timeout 可以设置超时时间,-W 10表示设定超时时间为10秒(这里需要说明的是,根据多篇参考资料,timeout是以毫秒为单位的,默认为4000毫秒,但是我的实际测试显示,在我的deppin系统上,这个单位为秒)

【-W timeout】 这个选项仅和-c 选项一起才能起作用。它使 ping  命令以最长的超时时间去等待应答(发送最后一个信息包后)。默认超时时间为4000ms(4s)

除了这个这个-W参数之外,subprocess.check_out(),同样也有一个参数timeout,也可以设置

1
2
3
4
5
try:
out_bytes = subprocess.check_output(['cmd','arg1','arg2'])
except subprocess.CalledProcessError as e:
out_bytes = e.output # Output generated before error
code = e.returncode # Return code

(四) 最后一个问题,因为开启和关闭v2ray服务,如何确保脚本以root权限运行。只需要使用os模块的getuid()函数即可,返回值如果是0,则代码运行于root用户下。用户在非特权模式下运行脚本,即没有使用sudo python3 test.py运行脚本,就提示用户要使用sudo命令。

1
2
3
import os
os.getuid()
os.getusername()

4.解析url

1
2
3
4
5
6
import urllib.parse as urlparse

net=urlparse.unquote(net)
netParse=urlparse.urlparse(net)
## 服务器地址
url=urlparse.parse_qs(netParse.query)

5.解析base64代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def base64StrFun(base64Str):
try:
base64Str=base64.urlsafe_b64decode(base64Str)
except:
try:
lens = len(base64Str)
lenx = lens - (lens % 4 if lens % 4 else 4)
base64Str= base64.decodestring(base64Str[:lenx])
except:
missing_padding = len(base64Str) % 4
if missing_padding != 0:
base64Str += b'='* (4 - missing_padding)
base64Str= base64.urlsafe_b64decode(base64Str)
return base64Str
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。