Python学习笔记(22),常用第三方模块,Pillow, requests, chardet, psutil

第三方模块

Pillow

在PIL的基础上创建了兼容的版本,名字叫Pillow。

操作图像

最常见的图像缩放操作,只需三四行代码

from PIL import Image

# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('test.jpg')
# 获得图像尺寸:
w, h = im.size
print('Original image size: %sx%s' % (w, h))
# 缩放到50%
im.thumbnail((w//2, h//2))
print('Resize image to: %sx%s' % (w//2, h//2))
# 把缩放后的图像用jpeg格式保存:
im.save('thumbnail.jpg', 'jpeg')
Original image size: 668x336
Resize image to: 334x168

其他功能比如切片、旋转、滤镜、输出文字、调色板等一应俱全。

比如,模糊效果也只需要几行代码:

from PIL import Image, ImageFilter

# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('test.jpg')
# 应用模糊滤镜:
im2 = im.filter(ImageFilter.BLUR)
im2.save('blur.jpg', 'jpeg')

PIL的ImageDraw提供了一系列绘图方法,让我们可以直接绘图。比如要生成字母验证图片:

from PIL import Image, ImageDraw, ImageFont, ImageFilter

import random

# 随机字母
def rndChar():
    return chr(random.randint(65, 90))

# 随机颜色1
def rndColor():
    return (random.randint(64, 255), random.randint(64, 255), 
random.randint(64, 255))

def rndColor2():
    return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))

# 240 x 60:
width = 60 * 4
height = 60
image = Image.new('RGB', (width, height), (255, 255, 255))
# 创建Font对象:
font = ImageFont.truetype('Arial.ttf', 36)
# 创建Draw对象:
draw = ImageDraw.Draw(image)
# 填充每个像素:
for x in range(width):
    for y in range(height):
        draw.point((x, y), fill=rndColor())
# 输出文字:
for t in range(4):
    draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2())
# 模糊:
image = image.filter(ImageFilter.BLUR)
image.save('code.jpg', 'jpeg')



pillow官方文档

requests

requests是一个更方便的获取网络资源的第三方库,处理URL资源特别方便。

import requests
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
url = 'https://www.douban.com/'
r = requests.get(url, headers=headers)

print(r.status_code)
# r.text output of html contents
200

requests能自动检测编码,使用encoding属性查看

r.encoding
'utf-8'

无论是文本还是二进制内容,都可以用content属性获得bytes对象:

r.content

发送POST请求时,只需要把get()方法编程post(),然后传入data参数作为POST请求的数据:

chardet

拿到一个bytes时,对其检测编码,可以用chardet检测编码,只需要一行代码:

import chardet
chardet.detect(b'Hello, world')
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
data = '床前明月光,疑似地上霜'.encode('gbk')
chardet.detect(data)
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
data = '床前明月光,疑似地上霜'.encode('utf-8')
chardet.detect(data)
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

psutil

import psutil
# 获取CPU信息
psutil.cpu_times()
scputimes(user=32626.27, nice=0.0, system=14508.95, idle=568788.44)
# 获取内存信息
psutil.virtual_memory()
svmem(total=17179869184, available=7001284608, percent=59.2, used=9303384064, free=75153408, active=6930427904, inactive=6864248832, wired=2372956160)
psutil.disk_partitions() # 磁盘分区信息
[sdiskpart(device='/dev/disk1s5', mountpoint='/', fstype='apfs', opts='ro,local,rootfs,dovolfs,journaled,multilabel'),
 sdiskpart(device='/dev/disk1s1', mountpoint='/System/Volumes/Data', fstype='apfs', opts='rw,local,dovolfs,dontbrowse,journaled,multilabel'),
 sdiskpart(device='/dev/disk1s4', mountpoint='/private/var/vm', fstype='apfs', opts='rw,local,dovolfs,dontbrowse,journaled,multilabel'),
 sdiskpart(device='/dev/disk1s3', mountpoint='/Volumes/Recovery', fstype='apfs', opts='rw,local,dovolfs,dontbrowse,journaled,multilabel')]
psutil.disk_usage('/')  # 磁盘使用情况
sdiskusage(total=250790436864, used=10991198208, free=31437127680, percent=25.9)
psutil.disk_io_counters() # 磁盘IO
sdiskio(read_count=1756806, write_count=1728842, read_bytes=20113038848, write_bytes=16606560256, read_time=376190, write_time=219220)
# 获取网络信息
psutil.net_io_counters() # 获取网络读写字节/包的个数
snetio(bytes_sent=285844480, bytes_recv=2818754560, packets_sent=1658969, packets_recv=3304945, errin=0, errout=0, dropin=0, dropout=0)
psutil.net_if_addrs() # 获取网络接口信息
{'lo0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None),
  snicaddr(family=<AddressFamily.AF_INET6: 30>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None),
  snicaddr(family=<AddressFamily.AF_INET6: 30>, address='fe80::1%lo0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)],
 'en0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.2.20', netmask='255.255.255.0', broadcast='192.168.2.255', ptp=None),
  snicaddr(family=<AddressFamily.AF_LINK: 18>, address='6c:96:cf:dd:1b:8d', netmask=None, broadcast=None, ptp=None),
  snicaddr(family=<AddressFamily.AF_INET6: 30>, address='fe80::804:b9cf:722c:c39f%en0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)],
 'en1': [snicaddr(family=<AddressFamily.AF_LINK: 18>, address='82:17:0d:9e:cc:40', netmask=None, broadcast=None, ptp=None)],
 'en2': [snicaddr(family=<AddressFamily.AF_LINK: 18>, address='82:17:0d:9e:cc:41', netmask=None, broadcast=None, ptp=None)],
 'bridge0': [snicaddr(family=<AddressFamily.AF_LINK: 18>, address='82:17:0d:9e:cc:40', netmask=None, broadcast=None, ptp=None)],
 'p2p0': [snicaddr(family=<AddressFamily.AF_LINK: 18>, address='0e:96:cf:dd:1b:8d', netmask=None, broadcast=None, ptp=None)],
 'awdl0': [snicaddr(family=<AddressFamily.AF_LINK: 18>, address='aa:f5:d6:e2:f0:ec', netmask=None, broadcast=None, ptp=None),
  snicaddr(family=<AddressFamily.AF_INET6: 30>, address='fe80::a8f5:d6ff:fee2:f0ec%awdl0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)],
 'llw0': [snicaddr(family=<AddressFamily.AF_LINK: 18>, address='aa:f5:d6:e2:f0:ec', netmask=None, broadcast=None, ptp=None),
  snicaddr(family=<AddressFamily.AF_INET6: 30>, address='fe80::a8f5:d6ff:fee2:f0ec%llw0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)],
 'utun0': [snicaddr(family=<AddressFamily.AF_INET6: 30>, address='fe80::66a2:1fb9:b595:1cba%utun0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)],
 'utun1': [snicaddr(family=<AddressFamily.AF_INET6: 30>, address='fe80::8b6d:bce7:4dca:24bc%utun1', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)]}
psutil.net_connections()  # 获取当前网络连接信息
print(psutil.pids()) # 所有进程ID
[0, 1, 134, 135, 138, 139, 140, 141, 144, 145, 146, 147, 151, 152, 155, 159, 160, 161, 164, 167, 168, 169, 170, 171, 172, 173, 174, 176, 179, 180, 181, 182, 186, 187, 188, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 210, 225, 231, 232, 235, 238, 241, 242, 243, 244, 252, 260, 274, 275, 276, 278, 279, 280, 281, 282, 284, 285, 286, 287, 293, 295, 296, 297, 302, 305, 306, 307, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 327, 328, 333, 334, 335, 338, 340, 342, 344, 345, 346, 348, 351, 353, 354, 355, 356, 358, 359, 360, 361, 362, 364, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 381, 382, 383, 384, 385, 386, 387, 388, 390, 393, 395, 397, 398, 399, 400, 401, 403, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 426, 427, 428, 429, 430, 431, 432, 434, 435, 436, 437, 438, 439, 440, 441, 442, 445, 446, 447, 450, 451, 452, 454, 456, 457, 458, 459, 460, 462, 463, 464, 466, 468, 472, 473, 474, 475, 476, 477, 478, 479, 481, 482, 483, 484, 485, 486, 487, 490, 491, 492, 493, 494, 495, 496, 497, 498, 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511, 515, 516, 517, 518, 522, 523, 524, 525, 535, 536, 537, 538, 539, 541, 542, 544, 545, 546, 552, 556, 557, 558, 559, 561, 562, 573, 576, 577, 579, 581, 585, 587, 589, 590, 593, 595, 596, 597, 598, 599, 600, 602, 605, 606, 609, 621, 623, 627, 628, 629, 630, 631, 644, 645, 646, 647, 648, 664, 666, 667, 669, 674, 678, 680, 682, 684, 695, 719, 723, 726, 729, 730, 731, 732, 733, 737, 738, 740, 745, 758, 761, 772, 775, 780, 781, 782, 783, 786, 789, 790, 799, 800, 812, 813, 822, 823, 824, 826, 827, 828, 829, 832, 836, 837, 839, 902, 905, 928, 929, 930, 936, 949, 950, 951, 952, 993, 1041, 1079, 1115, 1165, 1285, 1286, 1288, 1367, 1368, 1369, 1370, 1371, 1527, 1550, 1629, 1674, 1694, 1695, 1700, 1702, 1703, 1706, 1710, 1838, 2121, 2395, 2419, 2500, 3266, 3352, 3412, 3442, 3584, 3621, 3665, 3667, 3763, 3790, 3800, 3813, 3814, 3815, 3816, 3891, 3892, 3893, 3894, 3938, 4004, 4005, 4006, 4030, 4315, 4478, 4796, 4855, 5130, 5131, 5187, 5188, 5189, 5190, 5192, 5193, 5222, 5223, 5466, 5467, 5472, 5473, 5476, 5477, 5478, 5479, 5480, 5481, 5482, 5483, 5484, 5485, 5486, 5487, 5488, 5489, 5639, 5640, 5643, 5645, 5651, 5653, 5654, 5655, 5656, 5662, 5730, 5732, 5733, 6028, 6575, 6896, 7012, 7076, 7121, 7138, 7161, 7378, 7680, 7829, 7834, 7948, 7958, 7960, 7961, 8207, 8208, 8219, 8220, 8221, 8222, 8223, 8228, 8245, 8248, 8250, 8351, 8358, 8359, 8360, 8364, 8365]
p = psutil.Process(7834) # 获取进程ID,也就是当前Python进程
p.exe()  # 进程执行路径
'/Users/zoufan/Library/Anaconda3/anaconda3/bin/python3.7'
p.cwd()  # 进程工作目录
'/private/var/folders/x2/873yh2rn6jb6y0qr90xdsn0w0000gn/T/56e1f5a4-c8e3-4a32-b0e3-a2756479e0c7'
print(p.cmdline())  # 进程启动的命令行

['/Users/zoufan/Library/Anaconda3/anaconda3/bin/python', '-m', 'ipykernel_launcher', '-f', '/Users/zoufan/Library/Jupyter/runtime/kernel-092deb83-186d-4021-bce9-a657ca05a3c7.json']
print(p.ppid())     # 进程的父进程
4006
p.children()   # 子进程列表
[]

还有众多方法,可查阅资料了解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值