百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

最新Python学习教程_Python学习路线:python—收集系统信息

toyiye 2024-07-09 22:54 9 浏览 0 评论

Python学习教程(Python学习路线):python—收集系统信息

1.1 hashlib模块使用

获取文件的MD5值,和shell下的MD5sum一样

方法一:先实例化一个对象,再使用update做校验,最后十六进制查看hexdigest

	In [3]: import hashlib
	In [5]: md5 = hashlib.md5
	In [6]: md5.update("a")
	In [7]: md5.hexdigest
	Out[7]: '0cc175b9c0f1b6a831c399e269772661'
	In [8]: md5.update("b\n") #叠加,实际为ab\n的值
	In [9]: md5.hexdigest
	Out[9]: 'daa8075d6ac5ff8d0c6d4650adb4ef29'

说明:

对比shell,哈希值一样

	[root@huangzp3 python]# echo "ab"|md5sum
	daa8075d6ac5ff8d0c6d4650adb4ef29 -

与shell下一致,-n #表示不加换行符

	[root@huangzp3 python]# echo "a"|md5sum
	60b725f10c9c85c70d97880dfe8191b3 -
	[root@huangzp3 python]# echo -n "a"|md5sum
	0cc175b9c0f1b6a831c399e269772661 -

方法二:字符串短时,直接调用

	In [10]: hashlib.md5("hello").hexdigest
	Out[10]: '5d41402abc4b2a76b9719d911017c592'

脚本:

#!/usr/bin/env python
import sys
import hashlib
import codecs
def getMd5(f):
 md5 = hashlib.md5()
 with codecs.open(f) as fd:
 while True:
 data = fd.read(4096)
 if data:
 md5.update(data) #每读一次,获取一次md5值,MD5值累加
 else:
 break
 return md5.hexdigest()
 
if __name__ == "__main__":
 try:
 print getMd5(sys.argv[1])
 except IndexError:
 print ("%s follow a argument" % __file__)

运行结果:

	[root@huangzp3 python]# python 01.py 1.py
	e796a8f418fa90d7e4f0a162119f114a
	[root@huangzp3 python]# cat 1.py |md5sum
	e796a8f418fa90d7e4f0a162119f114a -

1.2 os.walk模块使用

os.walk:迭代目录里文件,返回一个列表,分别是:路径、路径下的目录、路径下的文件

	In [17]: walk = os.walk("/root/python/a")
	In [18]: for i,j,k in walk:print i,j,k
	/root/python/a ['b'] ['a.txt']
	/root/python/a/b ['c'] ['b.txt']
	/root/python/a/b/c ['c.txt']

脚本:

#!/usr/bin/env python
import sys
import hashlib
import codecs
import os
def getMd5(f):
 md5 = hashlib.md5()
 with codecs.open(f) as fd:
 while True:
 data = fd.read(4096)
 if data:
 md5.update(data)
 else:
 break
 return md5.hexdigest()
 
walk = os.walk(sys.argv[1])
s = ""
for i,j,k in walk:
 for fil in k:
 fa = os.path.join(i,fil)
result = getMd5(fa)
 s += result +" " +fa +"\n"
print s,

运行结果:

	[root@huangzp3 python]# python 02.py /root/python/
	b9f6f7a02766b3f9bd28369c6c331218 /root/python/20.py
	e796a8f418fa90d7e4f0a162119f114a /root/python/1.py
	01b1b4f4b2eb7155187c27057e9a4de2 /root/python/1.pyc

1.3 生成器yield

想捕获函数的值,但是又不想退出程序。yield,记住当前函数的值,用于下次调用。调用时用next方法或者for循环遍历

修改如上脚本:

#!/usr/bin/env python
import sys
import hashlib
import os
import codecs
 
def getMd5(f):
 md5 = hashlib.md5()
 with codecs.open(f) as fd:
 while True:
 data = fd.read(4096)
 if data:
 md5.update(data)
 else:
 break
 return md5.hexdigest()
 
def fileMd5(topdir):
 walk = os.walk(topdir)
 for i,j,k in walk:
 for fil in k:
 fa = os.path.join(i,fil)
 result = getMd5(fa)
 yield "%s %s" % (result,fa)
 
if __name__ == "__main__":
 topdir = sys.argv[1]
 md5 = fileMd5(topdir)
 for lis in md5:
 print lis

1.4 文件md5值的校验

找出目录中内容相同的文件

脚本:

#!/usr/bin/env python
import sys
import hashlib
import os
import codecs
 
def getMd5(f):
 md5 = hashlib.md5()
 with codecs.open(f) as fd:
 while True:
 data = fd.read(4096)
 if data:
 md5.update(data)
 else:
 break
 return md5.hexdigest()
 
def getDir(topdir):
 dic = {}
 walk = os.walk(topdir)
 for i,j,k in walk:
 for lis in k:
 fil = os.path.join(i,lis)
 md5 = getMd5(fil)
 if dic.has_key(md5):
 dic[md5].append(fil)
 else:
 dic[md5] = [fil] #dic[md5] = [fn] ,字典的key为MD5,value值为fn
 return dic
 
if __name__ == "__main__":
 result = getDir(sys.argv[1])
 for i,j in result.items():
 if len(j)>1:
 print i,j

运行结果:

	[root@huangzp3 python]# python 04.py /root/python
	b026324c6904b2a9cb4b88d6d61c81d1 ['./test/a/1.txt', './test/b/2.txt', './test.bak/test/a/1.txt', './test.bak/test/b/2.txt']

1.5 字典排序

字典是无序的

sorted(可迭代对象,cmp,key=根据什么排序,reverse=是否倒序),返回一个排序的列表

说明:key表示关键字;operator.itemgetter(0):根据字典的key值排序,(1)表示根据字典的value排序;reverse=True倒序

x.iteritems返回一个序列,items与iteritems的区别和range与xrange的区别一样

找出占用空间大的文件

脚本:

#/usr/bin/env python
import sys
import os
import operator
def getDic(topdir):
 dic = {}
 walk = os.walk(topdir)
 for i,j,k in walk:
 for lis in k:
 fs = os.path.join(i,lis)
 sz = os.path.getsize(fs)
 dic[fs] = sz
 return dic
 
if __name__ == "__main__":
 dic = getDic(sys.argv[1])
 sorted_dic = sorted(dic.iteritems(),key=operator.itemgetter(1),reverse=True)
 for k,v in sorted_dic[:10]:
 if v>1024:
 K = int(v)/1024
 if K>1024:
 M = K/1024
 if M>1024:
 v = str(M/1024) +"G"
 else:
 v = str(M) +"M"
 else:
 v = str(K) +"K"
 print k,"------>",v

运行结果:

	[root@huangzp3 python]# python 05.py /data/program/
	/data/program/mongo/data/data27018/local.2 ------> 511M
	/data/program/mongo/data/data27018/local.1 ------> 511M
	/data/program/mongo/data/data27017/local.1 ------> 511M
	/data/program/mongo/data/data27017/local.2 ------> 511M
	/data/program/mongo/logs/mongodb-27018.log ------> 488M
	/data/program/mysql/lib/libmysqld.a ------> 235M
	/data/program/mongo/data/data27018/journal/j._7 ------> 128M
	/data/program/mysql/bin/mysqld ------> 95M
	/data/program/mysql/bin/mysql_client_test_embedded ------> 87M
	/data/program/mysql/bin/mysql_embedded ------> 87M

1.6 python调用外部命令

1)os.system:输出在终端上,捕获不到

	In [4]: os.system("ls")
	001.sh 10.sh 1.py

2)os.popen:只能捕捉到标准输出,捕捉不到标准错误输出

	In [12]: a = os.popen("ls")
	In [13]: a.read
	a.read a.readline
	a.readinto a.readlines

3)os.popen2:返回2个对象,一个标准输入、一个标准输出

	In [14]: sdtin,stdout = os.popen2("sort")
	/usr/bin/ipython:1: DeprecationWarning: os.popen2 is deprecated. Use the subprocess module.
	#!/usr/bin/python2

4)os.popen3:返回3个对象,标准输入、标准输出、标准错误输出

	In [16]: stdin,stdout,stderr = os.popen3("ls a")
	/usr/bin/ipython:1: DeprecationWarning: os.popen3 is deprecated. Use the subprocess module.
	#!/usr/bin/python2

5)os.popen4:返回2个对象,pipe_in和pipe_out_err

6)subprosess

	subpeocess.call('ls -l --color /root',shell=True)

说明:输出不能捕捉到,类似于os.system;不加-l,就不用shell

	subprocess.check_call(['mkdir','/tmp/aaa'])

说明:会抛出python异常

	In [19]: subprocess.call("ls -l",shell=True)
	total 580868
	-rw-r--r-- 1 root root 103 Nov 22 16:23 001.sh
	-rw-r--r-- 1 root root 375 Nov 1 03:00 100.sh
	-rw-r--r-- 1 root root 47624178 Nov 1 19:35 100.txt

捕捉异常

脚本:

#/usr/bin/env python
import subprocess
try:
 subprocess.check_call("exit 1",shell=True) #check_call会抛出python异常
except subprocess.CalledProcessError:
 pass
print "hello world"

运行结果:

	[root@huangzp3 python]# python 06.py
	hello world

关于python—收集系统信息先跟大家分享这么多!后期继续跟大家更新Python学习教程

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码